在一个XIB中,有一个IBOutlet的UILabel叫 label_ XIB的线已经连好了

IBOutlet UILabel *label_;

如果我定义

@property(nonatomic,assign)UILabel *label_;@synthesize label_;

那么在dealloc里面加

[label_ release]; 

会造成程序的crash 给出的错误代码是
[CALayer release]: message sent to deallocated instance 0x8f14800(这个数字可以是随便的地址啦)

但是,如果我定义

@property(nonatomic,readonly)UILabel *label_;@synthesize label_;

在dealloc里面加

[label_ release];

程序就不会crash
进一步,如果我定义

@property(nonatomic,assign)UILabel *label;@synthesize label = label_;

在dealloc里面加

[label_ release];

程序依然不会crash
自然,即使是把上面的assign换成readonly自然也不会crash
接下来我们继续研究,如果是retain呢
如果我定义这个

@property(nonatomic,retain)UILabel *label_;@synthesize label_;

那么在dealloc里面

[label_ release];

那么不会crash!
可以想到,如果继续定义

@property(nonatomic,retain)UILabel *label;@synthesize label = label_;

就更加不会crash了,事实也证明了这一点

看来这玩意儿还是有规律可循的,写了这么多,大概规律也知道了

CocoaTouch 的SDK在将对应的XIB反序列话的时候,会将反序列出类的实例的指针值赋值给你的这个UIView对应的IBOutlet的指针,如果你的这个view 定义了自己存取器方法,而且将存取器的名字替代了IBOutlet的名字(或者说名字取成相同的)(这点很重要,如果不满足这一点的话,则不会出现crash的情况),那么这个赋值操作会调用这个自定义方法,即你的存取器方法定义的引用类型就决定了最终UIView对这个反序列后实例的引用类型, 如果你像上面第一种情况那样子定义assign的话,那么你的UIView对这个UILabel的引用就是assign,所以自然的,你在dealloc 里面就不能调用release。这样想,retain就好理解了,我在想,如果是readonly的话,之所以不会出问题,是因为在这个时候,既然不能用 你自定义的存取器方法对那个类的实例指针进行赋值,那么SDK里面自己的方法还是会按照默认情况下的来,即还是retain,所以在dealloc里面调 用release是不会有什么问题的。

所以简单的原则就是:

如果是IBOutlet的变量,那么定义存取器的时候,假设要做成assign,那么存取器方法的名字一定不要和IBOutlet的名字相同,如果相同了,就不能在dealloc里面release!

第一篇原创的技术文章,写完算是有点感觉了~

转载于:https://www.cnblogs.com/flyFreeZn/archive/2011/11/29/2267442.html

在XIB里面关于@property,@synthesize,release,dealloc的怪现象相关推荐

  1. 深入解析alloc/retain/release/dealloc实现

    首先通过GNUstep上得源码来叙述各个函数的实现(GNUstep是Cocoa框架的互换框架,二者的行为和实现方式很相似) GNUstep源码中NSObject类的alloc方法: id = obj ...

  2. Objective-C 内存管理retain和release

    OC使用引用计数来管理内存,每个继承NSObject的对象,内部都维护了一个引用计数器retainCount.当对象创建时(调用alloc或者new)引用计数器会+1, 手动调用retain()方法能 ...

  3. 成员变量和属性区别(@property那点事儿)

    历史由来: 接触iOS的人都知道,@property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法.  但这只是在iOS5之后,苹果推出的一个新机制.看老代码时, ...

  4. 关于Debug和Release编译方式

    问:怎么在VC6中把工程编译成release版本? 答:可以project->Set Active Config,选中release版本.此后,按F5或F7编译所得的结果就是release版本. ...

  5. Debug 和 Release 编译方式

    Debug 和 Release 编译方式的区别本文主要包含如下内容: 1. Debug 和 Release 编译方式的本质区别 2. 哪些情况下 Release 版会出错 3. 怎样"调试& ...

  6. VS Debug和Release版本的区别

    VS Debug和Release版本的区别 1. 变量. 大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值 ...

  7. 关于Debug和Release之本质区别的讨论

    一.Debug 和 Release 编译方式的本质区别     Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化 ...

  8. VC++调试程序、快捷键以及Debug版本与Release版本

    1.如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框,选择Release状态.C/C++标签中的Category选General, ...

  9. Debug下正常,而Release失败的真正原因

    本文主要包含如下内容:  1. Debug 和 Release 编译方式的本质区别  2. 哪些情况下 Release 版会出错  2. 怎样"调试" Release 版的程序  ...

最新文章

  1. IIS 应用程序池设置
  2. mysql 主从同步配置
  3. 一口气搞懂「链表」,就靠这20+张图了
  4. html5响应式设置meta
  5. 彻底理解正向代理、反向代理、透明代理
  6. Sql Server 2008将数据库导出sql脚本并导出数据
  7. java连接ftp一直阻塞
  8. Oracle的回收站和闪回查询机制(二)
  9. Linux Irq domain
  10. 数据挖掘导论课后习题答案-第四章
  11. matlab物探版,s4m matlab中画地震图件的子程序源代码,对物探人员很有用。 238万源代码下载- www.pudn.com...
  12. 马尔可夫链模型的信贷风险分析与预测
  13. 基于itil的it运维管理体系
  14. python显示图片_python Image 模块处理图片
  15. TensorRT——安装报错解决:sudo pip3 install tensorrt-8.4.0.6-cp38-none-linux_x86_64.whl
  16. opencv 手指位置检测
  17. MySQL安全分析:缓解MySQL零日漏洞
  18. java mail实现smtp登录验证
  19. 谷歌浏览器adobe flash过期解决办法
  20. 戴尔准备通过收购扩大其云计算业务

热门文章

  1. 微软 2006年7月已试发布 ERP Dynamics AX 简体中文版 4.0 (第一个简体中文版),请下吧 !...
  2. pat乙级相当于什么水平_雅思6分是什么水平?相当于英语几级
  3. 592zn rom/apk 自动签名工具_关于邮件签名证书的常见问题
  4. 山西专科学校计算机专业排名,河南单招计算机专业专科学校排名
  5. IDEA启动hadoop报Could not locate executable null\bin\winutils.exe in the Hadoop binaries.错误的解决办法
  6. oracle主备机密码文件不同步,oracle主备同步问题
  7. php中下载csv文件怎么打开,php对csv文件的读取,写入,输出下载操作详解
  8. opencv for java HoughLinesP的使用
  9. mysql rr gap nextkey_mysql中的各种锁把我搞糊涂啦~
  10. cad页面布局快捷键_炸裂“图纸集”功能、高手都在偷偷用的CAD图纸管理神器