博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
以前自学OC的笔记:在ObjectC使用MRC
阅读量:5123 次
发布时间:2019-06-13

本文共 1737 字,大约阅读时间需要 5 分钟。

哥当初钻牛角尖钻了一个通宵才理解出来的。

1 创建对像需要使用某个类,当对像实释放的时候会自动调用这个类的dealloc方法。所以每个类有自己的dealloc方法,当别的类创建的对象被释的时候,自动调用的dealloc方法是属于另一个类的,与本类的dealloc方法无关。

2 circle类里的方法调用point类,那么实际上circle类就是在使用对象(origin)。所以调用point类的时候,在方法里要给对象retain。

3 在circle类里的dealloc方法里要给circle对象所使用的point对象release,这样当circle被释放的时候会同时把point对象计数器-1。(因为circle死了,没使用point了)
4 会出现这样的情况:circle对象先使用point1对象,然后又用换成使用point2对象。而这时候circle对象还没被dealloc,也就是对象point1还没被计数器-1操作。所以在circle类的方法里要写多一句[_origin release],要不然point1就没被-1操作了。“_origin”是circle声明的一个对象;“origin”是setOrigin方法里的参数。
 
    这时产生了一个疑问:每次circle类创建对象的时候都会对自己所创建的对象(_origin)release再retain?那第一次circle创建对象的时候,对象不会直接被dealloc掉吗?
    答案:
    当对象“circle”还没有被创建的时候,“_origin”的计数器本来为0,你给 “_origin”发送多少次release或者retain都视为无效;只有当“_origin”被赋值为“origin”的时候,才能给“_origin”进行计数器操作。
    当对象“circle”还没有被创建的时候,对象“point” 已经被创建了,此时对象“point”的计数器本来为1,而 实验证明“origin”这时是指向“point”对象(第一个被创建的对象)的一个指针,所以你给 “origin”发送release会使point对象内存被释放。
 
我发现circle类是这样声明的:
@interface VSCircle : NSObject

{

    VSPoint *_origin;

}

 

- (void)setOrigin:(VSPoint*)origin;

 

- (VSPoint*)origin;

结论就是:“_origin”被赋值为“origin”之前“_origin”与“origin”是不同的,此时只能对“_origin”release或retain,这样才不会有影响。
 
实验证明可以有四种写法:
A写法:
[_origin release];        //给对象声明发送消息
_origin = origin;          
[_origin retain];           //给对象声明发送消息
 
B写法:
[_origin release];        //给对象声明发送消息
_origin = origin;          
[origin retain];           //给对象声明发送消息
 
C写法:
[_origin release];        //给对象声明发送消息
[origin retain];           //给参数origin发送消息
_origin = origin;
 
D写法:
[origin retain];           //给参数origin发送消息
[_origin release];        //给对象声明发送消息
_origin = origin;
 
其它写法程序无法正常运行也无法停止。
 
5 在初始化方法里头:self.name = name与_name = name的区别:
self.name是调用方法,_name = name是直接赋值。实例变量如果是基本数据型的(assign)可以赋值;如果是对象(retain,copy...)的就要调用set方法。一般使用self.name的格式安全,除非实例变量是只读的。只读的实例变量不能用self.name方法来初始化,因为只读变量没有set方法的。

转载于:https://www.cnblogs.com/YayaApp/p/3995800.html

你可能感兴趣的文章
MVC — 初步理解IIS工作流程
查看>>
yii2中的rules 自定义验证规则详解
查看>>
Spring的常见问题及答案
查看>>
[转]Java常用概念解答
查看>>
Python学习之==>文件操作
查看>>
w3svc无法启动
查看>>
腾讯后台开发面试总结,原创,吐血推荐!!
查看>>
免费开通二级域名的论坛
查看>>
27. Remove Element(LeetCode)
查看>>
容斥原理的二进制实现模版
查看>>
thinkphp小技巧
查看>>
NOIP复习资料——往年习题精选
查看>>
lintcode-medium-Best Time to Buy and Sell Stock II
查看>>
03-java学习-基本数据类型-运算符-键盘接收用户输入
查看>>
IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm
查看>>
POJ-3693 Maximum repetition substring 后缀数组
查看>>
[nodejs]国内npm安装nodejs modules失败的几个解决方案
查看>>
解析gson
查看>>
linux日常常用命令分析
查看>>
AsyncTask知识整理笔记
查看>>