文档章节

OC高效率52之在既有类中使用关联对象存放自定义数据

阿元
 阿元
发布于 2016/01/20 21:51
字数 327
阅读 41
收藏 1
#import "ViewController.h"
#import <objc/runtime.h>
//objc_AssociationPolicy  枚举  对应等效的属性
static void *EocMyAlertViewKey = @"EocMyAlertViewKey";

@interface ViewController ()<UIAlertViewDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    // Do any additional setup after loading the view, typically from a nib.
    //管理关联对象的方法
//    objc_setAssociatedObject(id object, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)设置关联对象值
//    objc_getAssociatedObject(id object, <#const void *key#>)获取关联对象值
//    objc_removeAssociatedObjects(<#id object#>) 移除指定对象的全部关联对象
    
    UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(200, 200, 100, 200)];
    button.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:button];
    [button addTarget:self action:@selector(action) forControlEvents:UIControlEventTouchUpInside];
    
}

-(void)action
{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Question" message:@"What do you want to do" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Continue", nil];
    
    void (^block)(NSInteger) = ^(NSInteger buttonIndex){
    
        if (buttonIndex == 0 ){
            [self doCancel:alert];
        }
        else
        {
            [self doContinue];
        }
    };
    //1.定义关联对象时 可指定内存管理语义,用以模仿定义属性所采用的“拥有关系”与“非拥有关系”
    objc_setAssociatedObject(alert, EocMyAlertViewKey, block,OBJC_ASSOCIATION_COPY);

    [alert show];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    //2.通过关联对象机制把两个对象连起来
    void (^block)(NSInteger) = objc_getAssociatedObject(alertView, EocMyAlertViewKey);
    block(buttonIndex);

    //3.只有在其他做法不可行时才应选用关联对象,因为这种方法通常会引入难以查找的bug
}
-(void)doCancel:(UIAlertView *)alert
{
    NSLog(@"Calcel");
    objc_removeAssociatedObjects(alert);
}

-(void)doContinue
{
    NSLog(@"doContinue");

}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end


© 著作权归作者所有

阿元
粉丝 5
博文 163
码字总数 109777
作品 0
浦东
程序员
私信 提问
iOS 编写高质量Objective-C代码(二)

《编写高质量OC代码》已经顺利完成一二三四篇! 附上链接: iOS 编写高质量Objective-C代码(一) iOS 编写高质量Objective-C代码(二) iOS 编写高质量Objective-C代码(三) iOS 编写高质量...

MrLiuQ
2018/08/13
0
0
编写高质量iOS与OS X代码的52个有效方法(上篇)

第一章 熟悉Objective-C 1. 了解Objective-C语言的起源 Objective-C(以下简称OC)是C语言的超集,相比C语言多了面向对象的特性。OC使用动态绑定的消息结构,换句话说,只有在运行时才会检查...

还是不够辣
2017/04/06
0
0
《Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法》阅读笔记

前言:第一次阅读此书大概是是一年半之前,在网上找到电子版,也就临时看了一晚上,之后就没有再涉猎。八月份决定抽出半个月左右的时间认真阅读下这本书(但是由于这两周一直在准备公司项目的...

Samson_Xu
2017/09/13
0
0
iOS底层原理总结 - 探寻Runtime本质(一)

isa的本质 在学习Runtime之前首先需要对isa的本质有一定的了解,这样之后学习Runtime会更便于理解。 回顾OC对象的本质,每个OC对象都含有一个isa指针,之前,isa仅仅是一个指针,保存着对象或...

xx_cc
2018/06/15
0
0
struts2部分总结

struts2细节 1.struts2基本配置 1.1 web.xml中配置(按xml指定顺序放置) <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPre......

我是小个子啊
2016/04/15
22
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring系列教程八: Spring实现事务的两种方式

一、 Spring事务概念: 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。...

我叫小糖主
今天
5
0
CentOS 的基本使用

1. 使用 sudo 命令, 可以以 root 身份执行命令, 必须要在 /etc/sudoers 中定义普通用户 2. 设置 阿里云 yum 镜像, 参考 https://opsx.alibaba.com/mirror # 备份mv /etc/yum.repos.d/CentO...

北漂的我
昨天
3
0
Proxmox VE技巧 移除PVE “没有有效订阅” 的弹窗提示

登陆的时候提示没有有效的订阅You do not have a valid subscription for this server. Please visit www.proxmox.com to get a list of available options. 用的是免费版的,所以每次都提示......

以谁为师
昨天
3
0
Java设计模式之外观模式(门面模式)

什么是外观模式   外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口...

须臾之余
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部