以下讨论在 MRC 下。

1,不要在init和dealloc函数中使用accessor

Don’t Use Accessor Methods in Initializer Methods and dealloc
The only places you shouldn’t use accessor methods to set an instance variable are in initializer methods and dealloc. To initialize a counter object with a number object representing zero, you might implement an init method as follows:

refs :https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html

dealloc 实现:

不推荐:

-(void)dealloc {
self.name = nil;
[super dealloc]
}

推荐:

-(void)dealloc {
[_name release];
_name = nil;
[super dealloc]
}

init 实现:

不推荐:

- init {
self = [super init];
if (self) {
self.count = [[NSNumber alloc] initWithInteger:];
}
return self;
}

推荐:

- init {
self = [super init];
if (self) {
_count = [[NSNumber alloc] initWithInteger:];
}
return self;
}

why:  对于init 中使用 self.name  访问器会引发其他副作用,可能会对键-值观察(KVO)的通知,或者你的子类 重载了 name的属性访问器(子类覆盖了父类的实现。)

假如Custom 实现如下,有一个属性count.

- init {
self = [super init];
if (self) {
self.count = [[NSNumber alloc] initWithInteger:];
}
return self;
}

Custom 的子类是 CustomSub,且实现如下

- init {
self = [super init];
if (self) {
}
return self;
}

同时重写了父类count 属性访问器

-(NSNumber *)count{
//custom....
}
-(void)setCount:(NSNumber *)number{
//custom.....
}

当你在初始化子类

self = [super init];  它会从NSObject ->Custom->CustomSub 中 调用init 分别初始化当前类得成员,你子类中重写了Custom 属性访问器,那么就会影响Custom 初始化自己的 成员count .

这是从设计模式上来说,子类不应该去影响父类初始化自己的成员。这样可能导致其他问题。

如果我们中规中矩的 这么写,可能不会出现问题。那我要想使坏,那...你懂的。。

so 我们应该在init  或 dealloc 中使用_count  直接访问属性。则不会出现上述问题。

dealloc 中使用 self.count

----------有可能count的生命周期已经结束,不能再接受消息--------

上面是从其它文章中拷过来的,我没太明白是在什么样的情况下,按理说 对一个nil 对象发送releas 消息不会有问题。

我个人理解: 其实init 、dealloc 中不建议使用 访问器而直接使用_property 根本原因是

子类不应该去影响 父类 初始化 和 释放 自己资源(property)【通过上面可知子类覆盖父类属性访问器的后果】,使用_property 可以有效避免一些未知错误。

参考:http://stackoverflow.com/questions/8056188/should-i-refer-to-self-property-in-the-init-method-with-arc/8056260#8056260

http://fann.im/blog/2012/08/14/dont-use-accessor-methods-in-init-and-dealloc/

2,  为什么 [super dealloc]; 要在最后

-(void)dealloc {
//custom release self source [super dealloc]
}

释放类的内存是在NSObject 里定义的,释放顺序应该是

先释放我本类里的source , 在调用父类中的dealloc .应该本类中可能拥有不止一个父类,沿着继承链

依次释放父类中的资源。

这个过程和init 过程相反,

-(id)init{
self = [super init];
if(self){
//custom init
}
}

注:可以把init过程比作生成一个洋葱,从最核心的NSObject(分配内存、初始化属性。)

外层逐层初始化自己的东西,直到本类……

dealloc 同理可以比作 卜洋葱。

关于dealloc 注意事项的更多相关文章

  1. App Today Extension开发注意事项

    从iOS 8起,就有了App Extension.Extension的种类至今也扩充到了19种,应用也很广泛,值得重点关注起来. Extension几乎可以看做一个内嵌的独立App,拥有独立的Bund ...

  2. 0c-41-ARC使用特点及注意事项

    1.ARC特点总结 1)不允许调用release,retain,retainCount 2)允许重写dealloc,但是不允许调用[super dealloc] 3)@property的参数: str ...

  3. iOS之NSNotificationCenter通知中心使用事项

    其实这里的通知和之前说到的KVO功能很想,也是用于监听操作的,但是和KVO不同的是,KVO只用来监听属性值的变化,这个发送监听的操作是系统控制的,我们控制不了,我们只能控制监听操作,类似于Androi ...

  4. 关于Block的使用和5点注意事项

    一.概念 首先需要了解的是Block是一个代码块,是一个变量的形式存在的. 二.构成了解 我们需要在函数中声明block,因为是变量的形式,而且存在静态变量形式 类型1:  NSString* (^b ...

  5. iPhone SDK中多线程的使用方法以及注意事项

    多线程iphonethreadapplication编程嵌入式 然现在大部分PC应用程序都支持多线程/多任务的开发方式,但是在iPhone上,Apple并不推荐使用多线程的编程方式.但是多线程编程毕竟 ...

  6. iOS 在 ARC 环境下 dealloc 的使用、理解误区

    iOS 在 ARC 环境下 dealloc 的使用.理解误区 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&qu ...

  7. block注意事项

    1.block的声明和注意事项 #import "ZYViewController.h" @interface ZYViewController () @end /*用typede ...

  8. jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧

    这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...

  9. Windows Server 2012 NIC Teaming介绍及注意事项

    Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...

随机推荐

  1. Minimum Transport Cost HDU1385(路径打印)

    最短路的路径打印问题 同时路径要是最小字典序 字典序用floyd方便很多 学会了两种打印路径的方法!!! #include <stdio.h> #include <string.h& ...

  2. 020 $.each的使用

    在工作中见到这个知识点,不是特别懂,就查了查资料,顺便整理一下 1.定义与用法 each() 方法规定为每个匹配元素规定运行的函数. 提示:返回 false 可用于及早停止循环. 语法 $(selec ...

  3. 【java并发核心一】Semaphore 的使用思路

    最近在看一本书<Java并发编程 核心方法与框架>,打算一边学习一边把学习的经验记下来,所粘贴的代码都是我运行过的,大家一起学习,欢迎吐槽. 估计也没多少人看我的博客,哈哈,那么我还是会记 ...

  4. sublime使用技巧之添加到右键菜单、集成VI

    熟悉开发工具,减少多余的操作流程有助于提高开发效率,而Sublime Text 2是sublime产品的经典版本,因此本文基于Sublime Text 2讲解sublime的使用技巧. VI的主要作用 ...

  5. AGC 018E.Sightseeing Plan(组合 DP)

    题目链接 \(Description\) 给定三个不相交的矩形\(A(X1,Y1)-(X2,Y2),B(X3,Y3)-(X4,Y4),C(X5,Y5)-(X6,Y6)\),求 从第一个矩形中某点\(a ...

  6. 小B的询问

    OJ题号:BZOJ3781.洛谷2709 思路: 根据平方和公式,$(a+b)^2=a^2+2ab+b^2$,即当$c_i$增加$1$时,新的答案增加$2C_i+1$,减少时亦同.莫队求解即可. #i ...

  7. rabbitmq使用(三)

    Publish/Subscribe In the previous tutorial we created a work queue. The assumption behind a work que ...

  8. 2d场景背景无限滚动

    之前都是直接借用的DoTween插件,两个背景无限交替位置进行,还有就是三个背景在利用Trigger进行判断显示与否循环: 示例脚本: private List<RectTransform> ...

  9. windows 64位环境下php执行环境部署配置

    1.下载安装包 地址可以网上找,我下载的是php-5.6.27-Win32-VC11-x64.zip 2.解压安装包,我的解压到D:\tools\php5.6 3.配置php.ini 在解压的目录中, ...

  10. spring-data-jpa中findOne与getOne的区别 getOne没数据 findOne有数据

    项目中用到了spring-data-jpa,今天在写一个update方法的时候报了个空指针,看了看是因为一个对象中的关联没有取出来,我用的是getOne取得这个对象,加断点看以一下这个对象是个hibe ...