#現(xiàn)在剛搬好家涡戳,收拾好余舶,目前不能在mac下使用網(wǎng)絡(luò)嗜桌,所以我在win下面寫(xiě)的代碼曙搬,不正確請(qǐng)見(jiàn)諒。
給分類(lèi)添加屬性
原理:給一個(gè)類(lèi)聲明屬性媒怯,本質(zhì)就是給這個(gè)類(lèi)添加關(guān)系订讼,并不是直接把這個(gè)值得內(nèi)存空間添加到類(lèi)的內(nèi)存空間。
#原理的意思 --- 例:
給一個(gè)Person類(lèi)添加一個(gè)name屬性扇苞,給name屬性賦值
賦值形式不是在Person類(lèi)里面創(chuàng)建這個(gè)name對(duì)象欺殿,
而是在Person類(lèi)外面創(chuàng)建這個(gè)對(duì)象,并使name對(duì)象與name屬性產(chǎn)生一種關(guān)聯(lián)
給系統(tǒng)的類(lèi)添加屬性的方法 ---- 創(chuàng)建系統(tǒng)的分類(lèi)鳖敷,也就是類(lèi)別祈餐,類(lèi)目...etc。很多種稱(chēng)呼哄陶。
#給NSObjcet添加一個(gè)分類(lèi)帆阳,聲明屬性name
# NSObject(Objc).h 頭文件中
@interface NSObject (Objc)
@property (nonatomic, strong)NSString *name;
<#注意:
在分類(lèi)中運(yùn)用property屋吨,只是聲明了name的getter/setter方法蜒谤。并未實(shí)現(xiàn)。
就這樣調(diào)用會(huì)報(bào)一個(gè)方法找不到的錯(cuò)誤至扰,所以一般分類(lèi)的屬性我們需要自己重寫(xiě)實(shí)現(xiàn)getter/setter方法鳍徽。
(這里面試官就會(huì)問(wèn)Category中,為什么不可以直接聲明屬性敢课。阶祭。。諸如此類(lèi)的直秆,你就回答他這個(gè)濒募。)
#>
@end
<#運(yùn)用運(yùn)行時(shí)添加屬性(導(dǎo)入<objc/message.h>)#>
#import "NSObject + Objc.h" //實(shí)現(xiàn)文件中
@implementation NSObject (Objc)
/// setter方法
- (void)setName:(NSString *)name{
/**
給對(duì)象添加屬性 --- > 實(shí)質(zhì)就是跟某個(gè)對(duì)象產(chǎn)生關(guān)聯(lián)
<#id objcet#> : 給哪個(gè)對(duì)象添加屬性
<#const void* key#>:屬性名,根據(jù)key去獲取關(guān)聯(lián)的對(duì)象
<# id value#>:關(guān)聯(lián)的值
<#objc_Association Policy policy#>:關(guān)聯(lián)策略
*/
//objc_setAssociatedObjct(<#id objcet#>, <#const void* key#>,<# id value#>,<#objc_Association Policy policy#>);
objc_setAssociatedObjct(self, @"name",name,OBJC_ASSOCIATION_RETURN_NONATOMIC);
// 參數(shù)對(duì)應(yīng)解釋?zhuān)?self : 本類(lèi)
@"name" : 是一個(gè)OC字符串圾结,也可以寫(xiě)C語(yǔ)言字符串<#void* 相當(dāng)于 OC中的 id>
name : 表示setter的參數(shù)瑰剃;
OBJC_ASSOCIATION_RETURN_NONATOMIC:這是一個(gè)枚舉值,你敲出來(lái)就知道選什么了筝野。
因?yàn)槲覀冞@里是傳入一個(gè)對(duì)象晌姚,所以使用return。
<#setter這邊就完結(jié)了#>
}
/// getter方法
- (NSString *)name{
// 只需要一個(gè)方法歇竟,想必你們也猜到了
return objc_getAssociatedObjct(self, @"name");
<#注意:第二個(gè)參數(shù)為key挥唠,要與set一致#>
}
@end
#在viewControllers中
- (void)viewDidLoad {
[super viewDidLoad];
NSObject *objc =[ [NSObject alloc] init];
objc.name = @"糖糖租到房子了";
NSLog(@"%@",objc.name);
}
#這里你就可以看到糖糖租到房子了,如果有什么不對(duì)的地方見(jiàn)諒焕议,我是在簡(jiǎn)書(shū)上面敲的宝磨。