iOS中block属性用copy修饰

之前开发中一直习惯用delegate,后来接触block越来越来,慢慢发现block在有些地方相对于delegate更简洁。
block实质是结构体、
下面是声明一个block属性:

#import "NKBaseViewController.h"

typedef void(^SelectAskResult)(NSString *name, NSString *ID);
@interface NKSeleAskViewController : NKBaseViewController

@property (nonatomic, copy) SelectAskResult seleResult;

@end

通常我们会在block中引用一些外部变量,而block一开始存放到栈上,随时会被系统释放,当其所在栈被释放的时候,这些本地变量将变得不可访问。一旦代码执行到block这段就会导致bad access。所以声明时用copy使其在堆上保持一份。

在给block添加代码块时:
引用的外部变量要采取弱引用,告诉block这个变量的引用计数不要+1。否则就会带来另一个问题,就是self的引用计数+1。这意味着很可能会导致循环引用。self持有vc,vc持有block,block持有self。结果就是内存泄漏。

__weak typeof(self) ws = self;
NKSeleAskViewController *vc = [[NKSeleAskViewController alloc] init];
self.vc = vc;
vc.seleResult = ^ (NSString *name, NSString *ID){
            ws.textF.text = name;
            ws.demand = ID;
 };
[self.navigationController pushViewController:vc animated:YES];

Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其实是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象的地址)数组。

weak 的实现原理可以概括一下三步:

1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。

2、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数, objc_storeWeak() 的作用是更新指针指向,创建对应的弱引用表。

3、释放时,调用clearDeallocating函数。clearDeallocating函数首先根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。

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

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,828评论 0 9
  • 两个月前,我毅然离开了三年前一毕业就加入的公司。在历经其两个子公司,不同的行业,不同的工作地点和工作环境后,我想让...
    Nicolellq阅读 1,456评论 0 0
  • 思想方法对于正确,高效,深度的思考具有重要的作用。方法是什么呢?方法是一种思维路径,能从一个全新的角度切入;方法是...
    天线的触角阅读 1,287评论 0 0
  • 题记:如果你爱一个人,让他(她)装修一次吧;如果你恨一个人,让他(她)装修一次吧。装修能检验出你和爱人的默契程度,...
    虫虫菲阅读 2,312评论 0 1