使用objc_getAssociatedObject关联对象

使用objc_getAssociatedObject在应用里出现崩溃,在此记录一下。

我在ViewController中做了测试,ViewController.m 在 Compiles Sources 里需要加上 -fno-objc-arc

#import "ViewController.h"
#import <objc/runtime.h>

@interface ViewController ()

@end

@implementation ViewController

//1.声明一个静态变量,用作关键字.此处也可以直接用一个字符串(但不推荐)
static char overViewKey;

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //2.创建一个数组变量
    NSArray * array =[[NSArray alloc] initWithArray:@[@"one",@"two",@"three"]];
    
    //3.创建一个字符串变量;为了演示的目的,这里使用initWithFormat:来确保字符串可以被销毁
    NSString * overview = [[NSString alloc] initWithFormat:@"%@",@"First three numbers"];
    
    //4.关联代码操作(关键);第四个参数用 OBJC_ASSOCIATION_RETAIN_NONATOMIC,也可以尝试 OBJC_ASSOCIATION_ASSIGN 第六步会crash。
    objc_setAssociatedObject(array, &overViewKey, overview, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
    //5.释放overview
    [overview release];
    
    //6.访问已经被我释放的对象
    NSLog(@"%p ~~ overview= %@",overview,overview);

    //7.释放array
    [array release];
    
    //8.访问array
    NSLog(@"%p ~~ array= %@",array,array);
    
    //9.访问overview
    NSLog(@"%p ~~ overview= %@",overview,overview);
}


@end

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容