在 Objective-C 中对 Block 应用 property 时的注意事项

 

应当使用:@property (nonatomic, copy)

今天在这个问题上犯错误了,找了好久才知道原因。


另外,简单的进行反汇编看了下,Block 被存储在静态变量区,运行时构造出一个运行栈,进行调用。

retain 并不会改变 Block 的引用计数,因此对 Block 应用 retain 相当于 assign。

但是既然在静态存储区,为什么会出现 EXC_BAD_ACCESS 呢?代码都在的呀。

网上都说 Block 在栈上,这应该是错误的:指向 Block 代码的指针在栈上。

感觉原因是这样:

执行静态区的代码,需要特殊的构造,比如:加载到寄存器,调整好 ESP 等。

而堆上的代码可以直接执行。

期待更详细的解释。



When storing blocks in properties, arrays or other data structures, there’s an important difference between using copy or retain. And in short, you should always use copy.

When blocks are first created, they are allocated on the stack. If the block is called when that stack frame has disappeared, it can have disastrous consequences, usually a EXC_BAD_ACCESS or something plain weird.

If you retain a stack allocated block (as they all start out being), nothing happens. It continues to be stack allocated and will crash your app when called. However, if you copy a stack allocated block, it will copy it to the heap, retaining references to local and instance variables used in the block, and calling it will behave as expected. However, if you copy a heap allocated block, it doesn’t copy it again, it just retains it.

So you should always declare your blocks as properties like this:

@property (copy, ...) (int)(^aBlock)();

And never like this:

@property (retain, ...) (int)(^aBlock)();

And when providing blocks to NSMutableArrays and the like, always copy, never retain.


转载于:https://www.cnblogs.com/Proteas/archive/2012/06/26/2563747.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建链表和遍历链表算法演示

#include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h>typedef struct Node {int data; //数据域struct Node * pNext; //指针域}Node, *pNode;//函数声明 pNode create_list(); void traverse_list(pNode pHead); int…

Redis 21问,你接得住不?

转载文章&#xff0c;原文&#xff1a;https://zhuanlan.zhihu.com/p/130923806 1.什么是redis? Redis 是一个基于内存的高性能key-value数据库。 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库&#xff0c;很像memcached&#xff0c;整个数据库统统加载在内存…

@Autowired、@Resource

Autowired通过 Autowired的使用来消除 set &#xff0c;get方法 - Spring 2.5 JPA hibernate 使用方法的点滴整理我们编写spring 框架的代码时候。一直遵循是这样一个规则&#xff1a;所有在spring中注入的bean 都建议定义成私有的域变量。并且要配套写上 get 和 set方法。虽然…

SpringCloud 入门教程(七): 熔断机制 -- 断路器

对断路器模式不太清楚的话&#xff0c;可以参看另一篇博文&#xff1a;断路器&#xff08;Curcuit Breaker&#xff09;模式&#xff0c;下面直接介绍Spring Cloud的断路器如何使用。 SpringCloud Netflix实现了断路器库的名字叫Hystrix. 在微服务架构下&#xff0c;通常会有多…

ABTest系统调研和需求

一、AB测试的必要性 1.1 算法评估 线下可以使用离线的AUC&#xff0c;NDCG等指标进行算法模型的评估&#xff0c;算法上线后怎样进行算法间的评估&#xff0c;上线的算法是好是坏&#xff0c;好多少&#xff1f;坏多少&#xff1f; 要有效评估算法&#xff0c;必须借助AB测试…

Shell基本命令汇总

几个基本的shell命令&#xff0c;用ssh管理主机必备。 1.ls 列出目录下的文件&#xff0c;不同类型的文件颜色不同&#xff0c;例如蓝色是文件夹&#xff0c;白色是文件 [rootrestoretmp steph]# ls file.html public_html test [rootrestoretmp steph]# 参数&#xff1a; ls…

SpringCloud 入门教程(八): 断路器指标数据监控Hystrix Dashboard 和 Turbine

1. Hystrix Dashboard (断路器&#xff1a;hystrix 仪表盘) Hystrix一个很重要的功能是&#xff0c;可以通过HystrixCommand收集相关数据指标. Hystrix Dashboard可以很高效的现实每个断路器的健康状况。 1&#xff09;. 在Ribbon服务g和Feign服务的Maven工程的pom.xml中都加…

DeepFM调参总结

一、结论 使用id类特征效果很好&#xff0c;很重要dropout对模型性能影响较大dnn层数对模型性能影响大同样数据特征的情况下&#xff0c;deepfm比lr在AUC&#xff08;ROC&#xff09;的效果好0.02&#xff5e;0.03只使用id类特征&#xff08;用户id&#xff0c;物品id&#xf…

【英语天天读】Man's Youth

作者&#xff1a;gnuhpc 出处&#xff1a;http://www.cnblogs.com/gnuhpc/ Mans youth is a wonderful thing: it is full of anguish and of magic and he never comes to know it as it is, until it has gone from him forever. 青春奇妙无穷&#xff0c;充满魅力。充满痛楚…

SpringCloud 入门教程(九): 路由网关zuul

在微服务架构中&#xff0c;需要几个关键的组件&#xff0c;服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等&#xff0c;由这几个组件可以组建一个简单的微服务架构。客户端的请求首先经过负载均衡&#xff08;zuul、Ngnix&#xff09;&#xff0c;再到达服…

谈谈button标签和input标签的区别

一句话概括主题&#xff1a;<button>具有<input type"button" ... >相同的作用但是在可操控性方面更加强大。 <button>和<input> 规范中指名&#xff1a;可以用<button>和<input>来做表单按扭。但<button>比<input>…

33岁的互联网人,看看我自己做了什么?

一、2021年之前 2020年8月中&#xff0c;从一家上市互联网公司离职&#xff0c;离职的原因和其中发生的一些事情也是一言难尽。感谢我当时的直属领导lfp和上层领导zjs&#xff0c;他们教会了我不少的东西&#xff0c;到现在都还有和他们联系&#xff0c;也很感谢我的同事&…

麦肯锡方法中的经验(读书摘要)

1. 界定问题 对MECE原则运用自如利用前辈经验&#xff0c;不做重复劳动在第一次会议上解决问题不要被表面现象所迷惑 2. 设计分析内容 找到关键驱动因素以大局为重不要妄想烧干大海有时候只能直接寻找解决方案 3. 数据收集 与事实为友不要接受“我没有想法”这种回答专题研…

SpringCloud 入门教程(十):和RabbitMQ的整合 -- 消息总线Spring Cloud Netflix Bus

在本教程第三讲Spring Cloud 入门教程(三)&#xff1a; 配置自动刷新中&#xff0c;通过POST方式向客户端发送/refresh请求&#xff0c; 可以让客户端获取到配置的最新变化。但试想一下&#xff0c; 在分布式系统中&#xff0c;如果存在很多个客户端都需要刷新改配置&#xff0…

设置背景图时防止图片拉伸的解决方法

在设置背景图时&#xff0c;如果图片不够大会被拉伸&#xff0c;使图片失真&#xff0c;如果图片太大会对view控件的显示造成影响。如果只是在ImageView中设置图片的话&#xff0c;在程式中可以利用setScaleType进行动态设定&#xff0c;在xml中可以简单的用android:scaleType来…

SpringCloud Eureka参数配置项详解

Eureka涉及到的参数配置项数量众多&#xff0c;它的很多功能都是通过参数配置来实现的&#xff0c;了解这些参数的含义有助于我们更好的应用Eureka的各种功能&#xff0c;下面对Eureka的配置项做具体介绍&#xff0c;供大家参考。 Eureka客户端配置 1、RegistryFetchIntervalSe…

shell执行的特殊变数

shell执行的特殊变数 以下是一些shell执行的特殊变数&#xff1a; $0 这个程式的执行名字 $n 这个程式的第n个参数值&#xff0c;n1..9 $* 这个程式的所有参数,被扩展成"$1c$2c$3"&#xff0c;其中c是IFS的第一个字符。 $# 这个程式的参数个数 $$ 这个程式的PID $! 执…

OAuth 2.0 - Authorization Code授权方式详解

I:OAuth 2.0 开发前期准备 天上不会自然掉馅饼让你轻松地去访问到人家资源服务器里面的用户数据资源&#xff0c;所以你需要做的前期开发准备工作就是把AppKey, AppSecret取到手 新浪获取传送门&#xff0c;腾讯获取传送门 这里说一下&#xff0c;在申请AppKey和AppSecret的过程…

最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)

一、spring cloud简介 鉴于《史上最简单的Spring Cloud教程》很受读者欢迎&#xff0c;再次我特意升级了一下版本&#xff0c;目前支持的版本为Spring Boot版本2.0.3.RELEASE,Spring Cloud版本为Finchley.RELEASE。 Finchley版本的官方文档如下&#xff1a; http://cloud.spri…