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

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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 概述 OC用于拓展已存在类的内置功能是它最强大的功能之一。类目、延展、协议提供了可以让你扩展类功能的方式。使用他们...
    abios阅读 283评论 0 0
  • 为什么使用类目是一种为现有的类添加新方法的方式有时需要对现有的类添加一些方法,之前都是通过继承相关的类,然后再子类...
    PeterKock阅读 960评论 0 6
  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    阳光的大男孩儿阅读 4,967评论 0 13
  • 安宁,在工作中是找不到的,它不在欢乐中,也不在这个世界上或者这个修道院中,它仅仅存在于人的灵魂里。 毛姆的作品都离...
    曌则璀璨阅读 459评论 0 0
  • 26岁多,已经工作了两年。 至今为止的人生里,没有大的磨难和波折,从小到大很多忧虑,没有真的实现过什么心愿,尽管认...
    今鱼阅读 180评论 0 0