1、使用場景
- 使用runtime動態添加屬性,目的就上讓某個屬性與對象產生關聯
- 需求:讓NSObject類,保存一個‘字符串’
2、解決方法一
- 給系統類定義一個分類(NSObject),并且定義一個屬性。然后實現該屬性的set方法和getter方法,通過定義一個全局變量來記錄這個屬性的值
//
// NSObject+objcet.h
// 005-runtime(動態添加屬性)
//
// Created by 紫荊秋雪 on 2017/2/25.
// Copyright ? 2017年 Revan. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSObject (objcet)
//property:只負責聲明 set方法、getter方法,當是并不會實現set方法和getter方法?
@property NSString *name;
@end
//
// NSObject+objcet.m
// 005-runtime(動態添加屬性)
//
// Created by 紫荊秋雪 on 2017/2/25.
// Copyright ? 2017年 Revan. All rights reserved.
//
#import "NSObject+objcet.h"
//定義一個全局變量
static NSString *_name;
@implementation NSObject (objcet)
- (void)setName:(NSString *)name {
_name = name;
}
- (NSString *)name {
return _name;
}
@end
//
// ViewController.m
// 005-runtime(動態添加屬性)
//
// Created by 紫荊秋雪 on 2017/2/25.
// Copyright ? 2017年 Revan. All rights reserved.
//
#import "ViewController.h"
#import "NSObject+objcet.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSObject *objc = [[NSObject alloc] init];
objc.name = @"123";
NSLog(@"%@", objc.name);
}
@end
- 使用全局變量來記錄屬性值有一個缺點:有可能這個這個對象已經銷毀了但是這個全局變量還存在
3、使用runtime來動態給對象添加屬性
//
// NSObject+objcet.h
// 005-runtime(動態添加屬性)
//
// Created by 紫荊秋雪 on 2017/2/25.
// Copyright ? 2017年 Revan. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSObject (objcet)
//property:只負責聲明 set方法、getter方法,當是并不會實現set方法和getter方法?
@property NSString *name;
@end
//
// NSObject+objcet.m
// 005-runtime(動態添加屬性)
//
// Created by 紫荊秋雪 on 2017/2/25.
// Copyright ? 2017年 Revan. All rights reserved.
//
#import "NSObject+objcet.h"
#import <objc/message.h>
@implementation NSObject (objcet)
- (void)setName:(NSString *)name {
// object: 給那個對象添加屬性
// key: 屬性名稱
// value: 屬性值
// policy: 保存策略
objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)name {
return objc_getAssociatedObject(self, @"name");
}
@end
//
// ViewController.m
// 005-runtime(動態添加屬性)
//
// Created by 紫荊秋雪 on 2017/2/25.
// Copyright ? 2017年 Revan. All rights reserved.
//
#import "ViewController.h"
#import "NSObject+objcet.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSObject *objc = [[NSObject alloc] init];
objc.name = @"123";
NSLog(@"%@", objc.name);
}
@end
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。