Runtime給分類添加屬性


分類中不能添加屬性。

在分類中,@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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM