category的屬性

在分類(lèi)中添加的屬性,不會(huì)自動(dòng)生成實(shí)例變量,分類(lèi)添加的屬性其實(shí)是添加該屬性的getter與setter方法。用@property聲明的屬性只會(huì)生成setter和getter的聲明,而不會(huì)生成成員變量和實(shí)現(xiàn)setter、getter方法。

-1 當(dāng)聲明了一個(gè)屬性,編譯器會(huì)報(bào)錯(cuò)

//Person.h文件
#import "Person.h"
@interface Person (test)
@property (nonatomic,copy) NSString *name;
@end

//Person.m文件
#import "Person+test.h"

@implementation Person (test)
@end

報(bào)錯(cuò)如下:


圖片.png

意思是:屬性 name的setter和getter方法需要自己實(shí)現(xiàn),或者使用 @dynamic。

PS:也就是說(shuō)分類(lèi)中只可以添加方法,但是不能添加成員變量

在runtime函數(shù)中,有一個(gè)class_addIvar()函數(shù)用于給類(lèi)添加成員變量,這個(gè)函數(shù)只能在“構(gòu)建一個(gè)類(lèi)的過(guò)程中”調(diào)用。一旦完成類(lèi)定義,就不能再添加成員變量了,文檔中有說(shuō)明:This function may only be called after objc_allocateClassPair and before objc_registerClassPair. Adding an instance variable to an existing class is not supported.
意思是:這個(gè)class_addIvar()函數(shù)只能在objc_allocateClassPair函數(shù)調(diào)用之后,在objc_registerClassPair調(diào)用之前進(jìn)行調(diào)用。
成員變量屬于類(lèi)實(shí)例,類(lèi)實(shí)例是一段內(nèi)存空間,當(dāng)一個(gè)類(lèi)在實(shí)例化之后,這個(gè)內(nèi)存空間的布局已經(jīng)完成了,布局無(wú)法進(jìn)行更改,因而成員變量也無(wú)法更改。但是屬性和方法不屬于類(lèi)實(shí)例

通過(guò)runtime來(lái)給category添加分類(lèi)

//Person.h文件
#import "Person.h"
@interface Person (test)
/** 姓名*/
@property (nonatomic,copy) NSString *name;
@end

#import "Person+test.h"
#import <objc/runtime.h>
static const void* nameKey = &nameKey;
@implementation Person (test)
-(void)setName:(NSString *)name
{
    objc_setAssociatedObject(self, nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)name
{
    return objc_getAssociatedObject(self, nameKey);
}
@end

引用: http://www.itdecent.cn/p/535d1574cb86

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容