类目,延展,协议

1.类目

类目就是为已存在的类添加新的方法。但是不能添加实例变量。比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现。

@interface NSMutableArray (Sort)
//为NSMutableArray类添加Sort方法,Sort就是类目名,做到见名知意
-(void)invert;//方法
@end

实现部分

#import
"NSMutableArray+Sort.h"
@implementation NSMutableArray
(Sort)
-(void)invert
{
   NSUInteger count = self.count;
   for
(int i = 0; i<count/2; i++)
   {
       [self exchangeObjectAtIndex:i
withObjectAtIndex:count-i-1];//第一个对象和最后一个对象交换
   }
}
@end

在主函数里边可以直接调用上边的invert方法

NSMutableArray * arr = [[NSMutableArray
alloc]initWithObjects:@"12",@"4",@"89",@"88",@"36", nil];    
[arr
invert];    
NSLog(@"%@",arr);

打印结果:

2012-08-13 11:12:03.324 类目[980:14503] (
   36,
   88,
   89,
   4,
   12
)

Category的使用场景有那些呢:
1、类包含了很多个方法实现,而这些方法需要不同团队的成员来实现
2、当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。

Category能实现上面的需求,当然也有使用Category是需要注意的问题:
1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
2、Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。

2.延展

延展的作用就是定义自己的私有方法。

形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。

#import "Student.h"
@interface Student
(extension)//为Student类创建一个私有的方法text
-(void)text;
@end

@implementation
Student
-(void)hello;
{
   [self  
text];
}

-(void)text
{
   NSLog(@"你好");
}
@end

外界  
[student hello]的时候就会打印出“你好”。但是在外界不能调用text方法,[student
text]是不对的。只能在.m文件里边通过self来调用私有方法text。隐藏了内部的实现。

3.协议

(1).协议声明了可以被其他的类实现的方法。协议本身必不会去实现。

(2).协议不是类,只是一个其他对象可以实现的接口。

定义一个协议:

#import
<Foundation/Foundation.h>
@protocol MarryProtocol <NSObject>//定义一个结婚协议,结婚协议也可以继承其它的协议。
@required  
//必须遵守的协议,在遵守MarryProtocol协议的类的.m文件中去实现里边的方法。
- (void)washClothes;
-
(void)cook;
@optional  //可选的协议
- (void)makeMoney;
@end

代理(委托)模式:自己有需求,但是让别人去做。

定义一个Men类

#import
<Foundation/Foundation.h>
#import "RoomService.h"
@interface Men :
NSObject
@property(nonatomic,retain)NSString *
name;
@property(nonatomic,assign)id<MarryProtocol>
mate;//定义一个代理
-(id)initWithName:(NSString
*)name;
-(void)needEat;
@end

定义一个Women类

#import
<Foundation/Foundation.h>
#import "MarryProtocol"
@interfaceWomen : NSObject
<MarryProtocol>  
//遵守协议
@property(nonatomic,retain)NSString *
name;
-(id)initWithName:(NSString *)name;
@end

在Men的实现里边

-(void)needEat
{
   [self.mate  
cook];
}

在Women的实现里边有一个方法

-(void)cook

{

NSLog(%@"wonmen正在做饭");

}

主函数里边

men.mate = women;

[men needEat];

打印出:wonmen正在做饭

4.协议也可以写在一个类里边,用到的时候引入类的头文件就可以。

时间: 2024-10-04 08:23:08

类目,延展,协议的相关文章

类目 延展 协议

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).文件名为:

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

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之间实现: 类有时需要方法

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

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

OC 类目、协议

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

类目 延展 单例 协议

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

OC-类目延展协议

类目(Category) 延展(Extension) 协议(Protocol) 一.类目 OC语言中的类目机制只有一个作用:为任何一个类添加方法 注意: 1.不能在分类中添加属性,只能添加方法 2.如果再分类里面使用@property,那么它只能生成getter和setter的声明,没有实现 3.如在在分类中写了与本类同名的方法,优先调用分类里面的方法,所以在分类中定义类的时候,尽量避免和本类中的方法重名 4.在分类里面可以访问本类里面所定义的属性 我们为NSString类添加一个方法,实现字符

Objective-C中的类目与协议

类目的定义与类的定义相似: 1.声明 @interface NSString (CSayHi)       NSString是目标类:CSayHi是类目名称: 且后面没有 :NSObject 2.实现 @implementation NSString (CSayHi) 3.文件名 NSString+CSayHi 类目: 类目也成为分类(特征) 1.可以为已知的类添加方法,哪怕是你没有源代码的类: 2.通过类目添加方法会成为原始类的一部分: 3.与原类中的方法同级: 4.而且会被子类继承: 类目的