分類中究竟能不能增加成員變數?
阿新 • • 發佈:2019-01-25
之前在相關的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到底有沒有擴充成員變數
我個人想到的簡單的方法就是
賦值一下,系統就報錯了,沒定義該變數~
結果:
分類中不能新增成員變數
(大神們,本文很多自己理解,如果有錯請指出,初學者“班門弄斧”了)
補充:(@dynamic,動態繫結)
@dynamic告訴編譯器,屬性的setter與getter方法由使用者自己實現,不自動生成。(當然對於readonly的屬性只需提供getter即可)。假如一個屬性被宣告為@dynamic var,然後你沒有提供@setter方法和@getter方法,編譯的時候沒問題,但是當程式執行到instance.var =someVar,由於缺setter方法會導致程式崩潰;或者當執行到 someVar = var時,由於缺getter方法同樣會導致崩潰。編譯時沒問題,執行時才執行相應的方法,這就是所謂的動態繫結。