OC教程3-类目延展协议

OC3-语言特性

本章主要讲解OC语言特性

  1. 类目(Category)
  2. 延展(Extension)
  3. 协议(Protocol)

1,类目

OC语言中的类目机制只有一个作用:为任何一个类添加方法

现在我们创建一个Student类

@interface Student : NSObject

@property(nonatomic,strong)NSString * name;

@end

@implementation

@end

如果想为Student类添加一个方法,现在有两种方法

  1. 直接修改Student类的源码,声明一个方法并实现。
  2. 使用类目。

在无法获取类的源码且需要给一个类添加方法的情况下,类目的作用就非常重要了。

创建类目的语法也非常简单,代码如下

@interface Student (Test)

-(void)test;

@end
@implementation Student (Test)

-(void)test
{
    NSLog(@"这里是Student类目的test方法");
}
@end

声明和实现的关键字都和之前一样。

不同的是,声明时候不需要指定父类,而是直接写要添加方法的类的名字,但后面一定要加一个括号,且括号里面写上类目名字。一个类可以有多个类目。

有了这个类目之后,虽然Student类的源码中没有test方法,但仍然可以正常用Student对象去调用这个方法。

Student * s = [[Student alloc] init];
[s test];

2,延展

延展可以看作是一种匿名的类目,类有时需要一些只为自己所见,所用的私有方法这种私有方法可以通过延展的方式来声明。

比如上文中的Student类有一个作弊的方法,不像被外界看得,但有不影响本身调用。这个方法就可以声明在延展内,而方法的实现仍然在Student的类内。

@interface Student ()
-(void)zuobi;
@end

通常我们会将类的声明放在扩展名为.h的文件内,实现放在扩展名为.m的文件内。在生产的可执行文件包种.m文件会被编译加密成.a文件,且不可逆转。

Student.h文件

@interface Student : NSObject

@property(nonatomic,strong)NSString * name;

@end

Student.m 文件

@interface Student ()
-(void)zuobi;
@end

@implementation Student (Test)

-(void)test
{
    NSLog(@"这里是Student类目的test方法");
}

-(void)zuobi
{
    NSLog(@"正在作弊");
}

@end

通常将延展的声明也放在.m文件中,这样便可以隐藏类的方法,不被外界所发现且类内可以正常使用。

3,协议

OC中的协议为一组方法的声明。不需要实现。遵守协议的类负责实现协议中的方法。

协议使用@protocol关键字进行声明。

其声明的方法中分为必须实现的方法和可选实现的方法。分别用@required@optional关键字标示。

如果不写默认为必须实现的方法。

@protocol Test <NSObject>

@required
-(void)fun1;//遵守该协议的类,必须实现的方法

@optional
-(void)fun2;//遵守该协议的类,可选实现的方法

@end

制定协议很简单,我们可以通过协议去规定一个对象的行为。

例如下面的方法

-(void)test:(id<Test>)obj;

这个方法便要求,obj对象必须是遵守Test协议的类创建的对象。

@property id <Test>obj;

同样,属性对象也可以用协议进行规定。

时间: 2024-09-30 16:41:43

OC教程3-类目延展协议的相关文章

类目 延展 协议

1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. 首先先建个类目 command+n 给什么类写类目下面就写那个类的名字 上面填的是给这个类添加的方法的名字 @interface NSMutableArray (Sort) //为NSMutableArray类添加Sort方法,Sort就是类目名,做到见名知意-(void)invert;//方法@end 实现部分 #import "NSMutableA

OC -- 类的类目 , 延展 , 协议

类目 分两部分: 1.系统已经写好的类目:按照功能对系统的类方法进行区分. 类目从@interface开始,后面是当前类名字,类名后是分类的功能, 到@end结束. 2.我们创建的类目,一般是为了把系统的类进行扩充. 对系统的类(例:NSString)添加文件Objective-C File {File:StringMethod; File Type:Category; Class: NSString}后,会自动出现@interface NSString (StringMethod).文件名为:

[objective-c] 03 - 类目 延展 协议

本章主要讲解OC语言特性 类目(Category) 延展(Extension) 协议(Protocol) 1.类目 OC语言中的类目机制只有一个作用:为任何一个类添加方法 现在我们创建一个Student类 @interface Student : NSObject @property(nonatomic,strong)NSString * name; @end @implementation @end 如果想为Student类添加一个方法,现在有两种方法 直接修改Student类的源码,声明一个

类目,延展,协议的基本概念

Catgory(类目/分类) 1.分类是给原有类添加方法,它只能添加方法,不能添加属性(成员变量) 2.分类中定义@property,只会生成setter/getter方法的声明,没有方法的实现以及私有变量. 3.分类中的方法不能和本类的方法名相同,否则会有警告,而且调用的时候会优先调用分类的方法,即覆盖本类的方法. 4.分类的方法和实现分开,一对多,1个.h文件对应多个.m文件,典型的分散实现: 延展(Extension) 1.延展为类创建私有方法,一个.m文件对应多个.h文件,分配权限时可以

【objective-c】类目 延展 协议

1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. Category的使用场景有那些呢:1.类包含了很多个方法实现,而这些方法需要不同团队的成员来实现2.当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时. Category能实现上面的需求,当然也有使用Category是需要注意的问题: 1.Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类

Objective-C类目延展协议

一.类目:(Category) 是在原有类的基础之上添加方法,在使用的时候只需要用原有类实例化出来的对象即可: 实际开发中什么情况下使用类目? 已经封装好的类,(不希望再改变原有类) 团队里面分工开发一个模块的时候可以使用自己定义的方法: 二.延展:(Extension)的基本概念和用法: 在xcode4.3之前直接使用self 调用方法  那时候会报错,所以的用延展 就是在类中添加私有方法,延展中声明的方法在类的本身的@interface  类名()和它对应的@end之间实现: 类有时需要方法

OC 类目、协议

类目:为现有的类添加新方法 1.需要添加该类的新方法,但是不能继承该类的情况下 类目使用需要注意的问题: 1.类目里面不能添加实例变量,但是类目可以声明属性,但必须实现set get 方法,在这两个实现方法里面依然不能使用自己添加的实例方法 2.类目里添加的方法不能和原类中的方法重名,否则会导致覆盖 3.一个类可以添加多个类目,但是类目名和方法名不能重复 4.类目中的方法可以成为原始类的一部分,和原始类方法级别相同,可以被子类继承 类目的创建与使用: File:是类目的名称 File Type:

OC category (分类,类目),日期类常用用法

学了这么久OC我们都知道OC中的类分为系统类和自定义的类,当我们在使用系统为我们提供的类时有时往往不能满足我们的需要,例如,字符串NSString类提供了比较字符串的方法compare,为数组排序时系统默认的是升序,当需要为数组按降序排序时,一种途径是需要新建一个类写一个降序的方法,而另一个途径就是系统提供的category(分类,类目),分类(类目,category)的目的为了给没有源代码的类添加方法(只能添加方法,不能添加实例变量),是扩充一个类功能的方式之一,为原有类扩充的方法会成为原类的

类目 延展 单例 协议

//类目#import <Foundation/Foundation.h> //声明一个NSString的分栏 @interface NSString (compareValue) - (NSComparisonResult)compareValue:(NSString *)string; @end ---------------------------------- #import "NSString+compareValue.h" @implementation NSS