004-runtime動(dòng)態(tài)添加屬性

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

  • 調(diào)用方法
//
//  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

  • 調(diào)用方法
//
//  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ù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,903評(píng)論 33 466
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,084評(píng)論 0 9
  • 蘋果官方文檔翻譯 《Objective-C語(yǔ)言編程》(Programming with Objective-C) ...
    fever105閱讀 26,338評(píng)論 19 129
  • 對(duì)于從事 iOS 開(kāi)發(fā)人員來(lái)說(shuō),所有的人都會(huì)答出【runtime 是運(yùn)行時(shí)】什么情況下用runtime?大部分人能...
    夢(mèng)夜繁星閱讀 3,812評(píng)論 7 64
  • 一,父組件向子組件傳值 1??,靜態(tài)的傳值props 2??,動(dòng)態(tài)的傳值props 要?jiǎng)討B(tài)地綁定父組件的數(shù)據(jù)到子模...
    今天又要上班嗎閱讀 506評(píng)論 0 2

友情鏈接更多精彩內(nèi)容