iOS分類中通過runtime添加動態屬性

  • 首先定義一個類
#import@interface Person : NSObject
@property (assign, nonatomic) NSInteger age;
-(void)run;
@end

#import "Person.h"
@implementation Person
-(void)run{
    NSLog(@"%s",__func__);
}
@end
  • 定義分類
#import "Person.h"
@interface Person (PersonExtention)
@property (copy, nonatomic) NSString *name;
-(void)saySex;
@end
#import "Person+PersonExtention.h"
#import <objc/runtime.h>
@implementation Person (PersonExtention)
//定義常量 必須是C語言字符串
static char *PersonNameKey = "PersonNameKey";
-(void)setName:(NSString *)name{
    /*
    OBJC_ASSOCIATION_ASSIGN;            //assign策略
    OBJC_ASSOCIATION_COPY_NONATOMIC;    //copy策略
    OBJC_ASSOCIATION_RETAIN_NONATOMIC;  // retain策略

    OBJC_ASSOCIATION_RETAIN;
    OBJC_ASSOCIATION_COPY;
     */
     /*
     * id object 給哪個對象的屬性賦值
       const void *key 屬性對應的key
       id value  設置屬性值為value
       objc_AssociationPolicy policy  使用的策略,是一個枚舉值,和copy,retain,assign是一樣的,手機開發一般都選擇NONATOMIC
          objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
     */

    objc_setAssociatedObject(self, PersonNameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)name{
    return objc_getAssociatedObject(self, PersonNameKey);
}
-(void)saySex{
    NSLog(@"%s----%@",__func__,self);
}

@end

總結:在分類中@property不會生成_變量,也不會實現getter和setter方法,我們可以手動實現如下

-(NSString *)name{
    return @"name";
}
-(void)setName:(NSString *)name{
    
}

但是這樣是沒什么意義的,而且分類中不允許定義變量,所以只能用runtime類實現

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • http://www.lxweimin.com/p/0ca0bbb0b200
    浩杰ee閱讀 202評論 0 2
  • 曾經奔跑在自己家 或是大娘家,那寬敞的 泥的墻,土的屋里 捉迷藏,騎竹馬 鼻涕吹泡,歡聲脆響 仿佛這里就是世界最美...
    丁海鵬閱讀 1,469評論 18 15
  • 要率性,不要任性。二者的區別在于,率性是由健康的天性引導,順應本我,不在乎功利、習俗和輿論;任性是被錯誤的情緒支配...
    抹綠_748f閱讀 226評論 0 0
  • HTTP 緩存策略。
    70歲了還要浪閱讀 142評論 0 0