分類到底能不能新增屬性?

2021-07-10 10:56:32 字數 1745 閱讀 1131

「通過執行時,分類是可以在不新增成員變數的情況下新增屬性的!」

遇到乙個問題,寫了乙個分類,但原先類的屬性不夠用。新增乙個屬性,呼叫的時候崩潰了,說是找不到getter、setter方法。查了下文件發現,oc的分類允許給分類新增屬性,但不會自動生成getter、setter方法。有沒有解決方案呢?有,通過執行時建立關聯引用。接下來以新增乙個這樣的屬性為例:

@property (nonatomic, copy) nsstring *str;
1、引入執行時標頭檔案。

#import 

2、在匿名分類或者標頭檔案中新增屬性。區別是:匿名分類中新增的是私有屬性,只在本類中可以使用,類的例項中不可以使用。標頭檔案中新增的在類的例項中也可以使用。

//分類的標頭檔案

@inte***ce

classname (categoryname)

//我要新增乙個例項也可以訪問的變數所以就寫在這裡了

@property (nonatomic, strong) nsstring *str;

@end

//匿名分類

@inte***ce

classname ()

@end

3、在實現裡面寫要新增屬性的getter、setter方法。

@implementation

classname (categoryname)

-(void)setstr:(nsstring *)str

-(nsstring *)str

@end

setstr:方法中使用了乙個objc_setassociatedobject的方法,這個方法有四個引數,分別是:源物件,關聯時的用來標記是哪乙個屬性的key(因為你可能要新增很多屬性),關聯的物件和乙個關聯策略。

用來標記是哪乙個屬性的key常見有三種寫法,但**效果是一樣的,如下:

//利用靜態變數位址唯一不變的特性

1、static

void *strkey = &strkey;

2、static nsstring *strkey = @"strkey";

3、static

char strkey;

關聯策略是個列舉值,解釋如下:

enum ;
4、完成後的整體**如下:

.h檔案

//分類的標頭檔案

@inte***ce

classname (categoryname)

@property (nonatomic, strong) nsstring *str;

@end

.m檔案

//實現檔案

#import "classname + categoryname.h"

#import

static

void *strkey = &strkey;

@implementation

classname (categoryname)

-(void)setstr:(nsstring *)str

-(nsstring *)str

@end

自動閱讀 到底 能不能賺錢

如今很流行的自動閱讀到底是乙個怎麼回事呢?到底什麼是自動閱讀呢?自動閱讀到底有沒有發展的前景呢?自動閱讀到底能不能賺錢呢?那麼自動閱讀到底有沒有發展前景呢?這個需要從幾個方面進行討論。要想進行手機批量自動閱讀進行賺錢,當然不能只是在一台兩台手機上進行,這樣子的效率是非常低的,即使你的手機二十四小時都...

jquery能不能自定義屬性

jquery能自定義屬性。jquery中,可用attr 來給元素新增自定義屬性,並設定屬性值 若只新增單個屬性,可用 元素物件.attr 屬性名 值 若多個屬性則用 元素物件.attr 本教程操作環境 windows7系統 jquery1.10.2版本 dell g3電腦。jquery能自定義屬性。...

為or in平反 or in到底能不能利用索引?

先說乙個笑話,作為開場白。俺也換換風格試一試,呵呵。在以前,有三個書生趕考,在路上遇到了乙個算命先生,於是就問算命先生 我們三個人趕考,結果如何呀?算命先生伸出來了乙個手指頭 食指 三個書生趕考的結果是,有乙個人考中了。三人一想呀,這個掛算的對呀,有乙個人考中了嘛。其實 乙個手指頭 是很模糊的,很忽...