Objective-C 「类目、延展、协议」

类目(Category)

(1).为已知的类添加新的方法,无论是否知道类的源代码,这些类包括自己定义的类和系统已有的类。
(2).将类的实现分散到多个不同的文件中,将多个类目的声明放入同一个.h文件中,将实现放入多个.m方法中。
(3).使用类目创建对私有方法的前向引用,就是为类创建私有方法。
(4).向对象添加非正式协议,现在逐渐被正式协议做替代。
注意:类目里面只能写方法,不能写声明和属性,所以,类目不能作为接口来用

注意:

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


创建Objective-C文件

创建类目文件

生成类目文件

NSString+LuisX.h文件中

#import <Foundation/Foundation.h>
#pragma mark - NSString:分类类型 LuisX:分类名 
@interface NSString (LuisX) { //不能在分类中定义成员 } - (NSInteger)getMyStringLength; //声明实例方法 + (NSString *)getHomeDirectory; //声明类方法 @end

NSString+LuisX.m文件中

#import "NSString+LuisX.h"

@implementation NSString (LuisX) //实现实例方法 - (NSInteger)getMyStringLength{ NSInteger stringLength = [self length]; return stringLength; } //实现类方法 + (NSString *)getHomeDirectory{ return NSHomeDirectory(); } @end

类目演示

    //类目演示//

#import <Foundation/Foundation.h>
#import "NSString+LuisX.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSString *str = @"FengXu"; NSInteger length = [str getMyStringLength]; NSString *homeDicStr = [NSString getHomeDirectory]; NSLog(@"实例方法: %ld", length); NSLog(@"类方法: %@", homeDicStr); //输出: 实例方法: 6 //输出: 类方法: /Users/apple } return 0; }

延展(Extension)

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

Father.h文件中

#import <Foundation/Foundation.h>

@interface Father : NSObject - (void)work; @end

Father.m文件中

#import "Father.h"
//╭--------------------延展(管理私有)--------------------╮
//@interface...@end可省略,但不建议。(方便看出哪些是私有的方法)
//声明私有,()中省略了private @interface Father () @property (nonatomic, copy) NSString *company; - (void)showMyInfo; @end //╰--------------------延展(管理私有)--------------------╯ @implementation Father{ //此处用来定义属性(私有属性) NSString *_name; } - (void)work{ NSLog(@"公有方法"); [self showMyInfo]; } - (void)showMyInfo{ NSLog(@"私有方法"); } @end

延展演示

    //延展演示//

#import <Foundation/Foundation.h>
#import "Father.h" int main(int argc, const char * argv[]) { @autoreleasepool { Father *father = [[Father alloc] init]; [father work]; //输出: 公有方法 //输出: 私有方法 } return 0; }

协议(Protocol)

(1).协议声明了可以被其他的类实现方法。协议本身并不会去实现。
(2).协议不是类,只是一个其他对象可以实现的接口。
(3).一个类可以通过协议,用来遵循多个类中的方法,这样可以做到多继承的效果

注意:

@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(简书作者)
原文链接:http://www.jianshu.com/p/1ff0ffa90cc1
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

转载于:https://www.cnblogs.com/niHaoHuiGe/p/5620725.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值