1. 程式人生 > >分類中究竟能不能增加成員變數?

分類中究竟能不能增加成員變數?

之前在相關的OC書上看到的關於分類的說法是:只能增加方法,但是不能增加成員變數。
但是今天,在一個練習中,需要用到增加一個成員變數,於是寫下了下列程式碼:(已提出來單獨講此問題)

NSObject+Test.h

 #import <Foundation/Foundation.h>

 @interface NSObject (Test)

 @property (nonatomic,copy) NSString *str;

 @end

NSObject+Test.m

 #import "NSObject+Test.h"

 @implementation NSObject
(Test)
- (void)setStr:(NSString *)str { NSLog(@"%@",str); } @end

(在別處已建立類物件,並呼叫setter方法賦值str)

結果這是可行的,沒有error,只有warning,也列印成功了

Property 'str' requires method 'str' to be defined - use @dynamic or provide a method implementation in this category

查出來去除警告的方法:

如何理解

@property在通常情況下,除了生成setter和getter方法以外,如果沒有該成員變數還會生成成員變數。而在分類中,@property只是生成setter和getter方法(非readonly),
等價於聲明瞭setter和getter方法

 - (void)setStr:(NSString *)str;
 - (NSString *)str;

新增這句話@dynamic str;是告訴編譯器,setter和getter方法由使用者自己實現,不自動生成。這裡涉及一個動態繫結的概念。

此處的@property到底有沒有擴充成員變數
我個人想到的簡單的方法就是
str賦值
賦值一下,系統就報錯了,沒定義該變數~

結果:

分類中不能新增成員變數
(大神們,本文很多自己理解,如果有錯請指出,初學者“班門弄斧”了)

補充:(@dynamic,動態繫結)

@dynamic告訴編譯器,屬性的setter與getter方法由使用者自己實現,不自動生成。(當然對於readonly的屬性只需提供getter即可)。假如一個屬性被宣告為@dynamic var,然後你沒有提供@setter方法和@getter方法,編譯的時候沒問題,但是當程式執行到instance.var =someVar,由於缺setter方法會導致程式崩潰;或者當執行到 someVar = var時,由於缺getter方法同樣會導致崩潰。編譯時沒問題,執行時才執行相應的方法,這就是所謂的動態繫結。