iOS类目、延展和协议

类目:为已知的类增加新的方法;注意:类目里面只能写方法,不能写声明和属性,所以,类目不能作为接口来用

1、类目无法向已有类中添加实例变量。
2、如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,如果方法名冲突,已有类中的原始方法便无法使用。
3、在使用类目的时候,最好是将自己扩展的方法和原始方法区分开来。

1、类目方法的应用:

1)对现有类进行扩展:如:可以扩展Cocoatouch框架中的类,在类目中增加的方法会被子类继承,而且在运行时跟其他的方法没有区别。

2)作为子类的替代手段:不需要定义和使用一个子类,可以通过类目直接向已有的类里增加方法。

3)对类中的方法归类:利用catigory把一个庞大的类划分为小块来分别进行开发,从而更好地对类中的方法进行更新和维护。

2、类目方法的局限性:

1)无法向类目中添加

新的实例变量,类目没有位置来容纳实例变量。如果想增加类的实例变量,只能通过定义子类的方式。

2)如若,在类目中覆盖先后类的方法。这样会引起super消息的断裂,因为类目总的方法具有更高的优先级,因此,一般不要覆盖现有类中的方法。

3、类目的定义:

类目的命名规则:类名+扩展方法,如“NSString+Revert”。类目的接口声明与类的定义十分相似,但类目不继承父类,只需要带有一个括号,表明该类目的主要用途。

4、举例说明:

NSString+Revert.h文件:

NSString+Revert.m文件:

延展:通知在本类的定义里使用类目来声明私有方法;

(1).延展的作用就是定义自己的私有方法。
(2).在自己类的实现文件中添加类目(匿名类目)来声明私有方法。(只有本类的.m文件中才能使用)。
(3).形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。

类的延展可看成是一种匿名的类目,类有时需要一些只有自己看得见的,所用的私有方法可以通过延展的方式来声明,延展中定义的方法在类本身的@implementation代码区域中进行实现。

当在定义延展的时候不提供类目名时,延展中定义的方法既被视为“必须实现”的API在这种情况下,如果方法没有实现代码,那么编译器会报警告,这个时候方法的实现就一定要出现在类主体的@implementation代码块中了。

协议

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

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

注意:

@required 必须方法 (默认)
@optional 可选方法

Girl.h文件中

#import <Foundation/Foundation.h>

#warning ?????????? 1.声明协议 ??????????
@protocol MarriageDelegate <NSObject>

@required       //必须方法(默认)
- (void)makeMoney;
- (void)satisfyHer;
@optional       //可选方法
- (void)cooking;

@end

@interface Girl : NSObject

#warning ?????????? 2.设置代理人属性 ??????????
@property (nonatomic, assign) id<Marriage> delegate;
- (void)buybuybuy;

@end

Girl.m文件中

#import "Girl.h"

@implementation Girl

- (void)buybuybuy{
#warning ?????????? 3.代理人执行方法 ??????????
    [self.delegate makeMoney];
}

@end

Boy.h文件中

#import <Foundation/Foundation.h>
#import "Girl.h"

#warning ?????????? 4.签订协议 (当前类中要实现必须方法) ??????????
@interface Boy : NSObject <MarriageDelegate>

@end

Boy.m文件中

#import "Boy.h"

@implementation Boy

#warning ?????????? 6.实现协议中声明的必须方法 ??????????
- (void)makeMoney{
    NSLog(@"赚钱");
}

- (void)satisfyHer{
    NSLog(@"亲吻");
}

@end

协议演示

    //////////协议演示//////////

#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h"

int main(int argc, const char * argv[]) {

    //////////使用代理//////////
    Girl *girl = [[Girl alloc] init];
    Boy *boy = [[Boy alloc] init];
#warning ?????????? 5.指定代理人 ??????????
    girl.delegate = boy;
    [girl buybuybuy];
    //输出: 赚钱

    //判断是否对象是否遵循某些协议
    BOOL result = [girl conformsToProtocol:@protocol(Marriage)];
    if (result) {
        NSLog(@"遵循Marriage协议");
    }else{
        NSLog(@"不遵循Marriage协议");
    }
    //输出: 不遵循Marriage协议

    return 0;
}

本文整理了简书Luisx的文章和51CTO蓝鸥张浩的博客,然后自己整理的,希望大家对类目、延展和协议有个新的认识。

时间: 2024-10-11 05:54:33

iOS类目、延展和协议的相关文章

类目 延展 协议

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

iOS -类目,延展,协议

1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. @interface NSMutableArray (Sort) //为NSMutableArray类添加Sort方法,Sort就是类目名,做到见名知意-(void)invert;//方法@end 实现部分 #import "NSMutableArray+Sort.h"@implementation NSMutableArray (Sort)

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

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

类目 延展 单例 协议

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

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

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

iOS类目

首先我们解释一下类目是什么 iOS中类目是为给已经存在的类添加新的方法.(但是不能添加实例变量) 也就是说 我们已经有一个类了 ,但是我们发现这个类目前所提供的方法,满足不了我们的需求,我们需要新的方法,但是我们有不想或者不能动这个类的原始写法,此时类目就可以实现不用动这个类的情况下 为他添加新的方法. 比如说: 假如,我们把人看作一个类,我们对人的定义包括吃饭,睡觉,穿衣等等. 他的方法包括了 如何吃饭,如何穿衣,如何睡觉等等 但是,有一天汽车出现了,我们发现我们之前对人的定义没有 开汽车这个