1、使用場(chǎng)景
- 使用runtime動(dòng)態(tài)添加屬性,目的就上讓某個(gè)屬性與對(duì)象產(chǎn)生關(guān)聯(lián)
- 需求:讓NSObject類,保存一個(gè)‘字符串’
2、解決方法一
- 給系統(tǒng)類定義一個(gè)分類(NSObject),并且定義一個(gè)屬性。然后實(shí)現(xiàn)該屬性的set方法和getter方法,通過(guò)定義一個(gè)全局變量來(lái)記錄這個(gè)屬性的值
//
// NSObject+objcet.h
// 005-runtime(動(dòng)態(tài)添加屬性)
//
// Created by 紫荊秋雪 on 2017/2/25.
// Copyright ? 2017年 Revan. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSObject (objcet)
//property:只負(fù)責(zé)聲明 set方法、getter方法,當(dāng)是并不會(huì)實(shí)現(xiàn)set方法和getter方法?
@property NSString *name;
@end
//
// NSObject+objcet.m
// 005-runtime(動(dòng)態(tài)添加屬性)
//
// Created by 紫荊秋雪 on 2017/2/25.
// Copyright ? 2017年 Revan. All rights reserved.
//
#import "NSObject+objcet.h"
//定義一個(gè)全局變量
static NSString *_name;
@implementation NSObject (objcet)
- (void)setName:(NSString *)name {
_name = name;
}
- (NSString *)name {
return _name;
}
@end
//
// ViewController.m
// 005-runtime(動(dòng)態(tài)添加屬性)
//
// 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
- 使用全局變量來(lái)記錄屬性值有一個(gè)缺點(diǎn):有可能這個(gè)這個(gè)對(duì)象已經(jīng)銷毀了但是這個(gè)全局變量還存在
3、使用runtime來(lái)動(dòng)態(tài)給對(duì)象添加屬性
//
// NSObject+objcet.h
// 005-runtime(動(dòng)態(tài)添加屬性)
//
// Created by 紫荊秋雪 on 2017/2/25.
// Copyright ? 2017年 Revan. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSObject (objcet)
//property:只負(fù)責(zé)聲明 set方法、getter方法,當(dāng)是并不會(huì)實(shí)現(xiàn)set方法和getter方法?
@property NSString *name;
@end
//
// NSObject+objcet.m
// 005-runtime(動(dòng)態(tài)添加屬性)
//
// 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: 給那個(gè)對(duì)象添加屬性
// key: 屬性名稱
// value: 屬性值
// policy: 保存策略
objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)name {
return objc_getAssociatedObject(self, @"name");
}
@end
//
// ViewController.m
// 005-runtime(動(dòng)態(tài)添加屬性)
//
// 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
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。