分類中不能添加屬性。
在分類中,@property (nonatomic, assign) NSInteger age;只會生成同名的setter和getter方法,不會生成帶_的成員變量和對應的setter和getter方法的實現。
那怎么給分類添加屬性呢?使用運行時可以。
oc有兩個運行時方法:
添加屬性,在setter方法中調用:objc_setAssociatedObject
獲取屬性,在getter方法中調用:objc_getAssociatedObject
// 本類頭文件及實現文件 #import <Foundation/Foundation.h> @interface Person : NSObject // 聲明一個屬性 @property (nonatomic, copy) NSString *name; @end #import "Person.h" @implementation Person @end
// 分類頭文件及實現文件 #import "Person.h" @interface Person (Extension) // 分類中聲明屬性,只會生成setter和getter方法的聲明,不會生成帶“_”的成員變量和setter和getter方法的實現 @property (nonatomic, assign) NSInteger age; @end #import "Person+Extension.h" // 使用運行時,需要導入頭文件 #import <objc/runtime.h> @implementation Person (Extension) - (void)setAge:(NSInteger)age{ // 使用運行時關聯對象,person對象(self)強引用age對象,並且設置標記為"age"(可以根據該標記來獲取引用的對象age,標記可以為任意字符,只要setter和getter中的標記一致就可以) // 參數1:源對象 // 參數2:關聯時用來標記屬性的key(因為可能要添加很多屬性) // 參數3:關聯的對象 // 參數4:關聯策略 objc_setAssociatedObject(self, @"age", @(age), OBJC_ASSOCIATION_RETAIN); } - (NSInteger)age{ // 根據“age”標識取person對象(self)強引用的age對象 // 參數1:源對象 // 參數2:關聯時用來標記屬性的key(因為可能要添加很多屬性) return [objc_getAssociatedObject(self, @"age") integerValue]; } @end
調用:
#import "ViewController.h" #import "Person.h" // 導入本類頭文件 #import "Person+Extension.h" // 導入分類頭文件 @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; Person *per = [[Person alloc] init]; per.name = @"xiaoming"; // 本類中的屬性 per.age = 22; // 分類中的屬性 NSLog(@"%@--%zd",per.name,per.age); // 本類和分類中的屬性都可以打印出來,說明都正常存儲了數據 } @end