objc_setAssociatedObject/objc_getAssociatedObject


objc_setAssociatedObject/objc_getAssociatedObject


  • objc_setAssociatedObject來把一個對象與另外一個對象進行關聯。該函數需要四個參數:源對象,關鍵字,關聯的對象和一個關聯策略。

      OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
    
    • 關鍵字是一個void類型的指針。每一個關聯的關鍵字必須是唯一的。通常都是會采用靜態變量來作為關鍵字。

    • 關聯策略表明了相關的對象是通過賦值,保留引用還是復制的方式進行關聯的;還有這種關聯是原子的還是非原子的。這里的關聯策略和聲明屬性時的很類似。這種關聯策略是通過使用預先定義好的常量來表示的。

實現 動態向類中添加 方法

示例:

@interface NSObject (CategoryWithProperty)

@property (nonatomic, strong) NSObject *property;

@end

@implementation NSObject (CategoryWithProperty)

- (NSObject *)property {
	return objc_getAssociatedObject(self, @selector(property));
}

- (void)setProperty:(NSObject *)value {
	objc_setAssociatedObject(self, @selector(property), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

動態增加屬性

示例:

#import "UILabel+Associate.h"
#import <objc/runtime.h>

@implementation UILabel (Associate)

static char flashColorKey;

- (void) setFlashColor:(UIColor *) flashColor{
objc_setAssociatedObject(self, &flashColorKey, flashColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (UIColor *) getFlashColor{
	return objc_getAssociatedObject(self, &flashColorKey);
}

@end

斷開關聯

  • 斷開關聯是使用objc_setAssociatedObject函數,傳入nil值即可。
  • 使用函數objc_removeAssociatedObjects可以斷開所有關聯


免責聲明!

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



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