Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 关于dealoc调用的混淆_Objective C_Cocoa_Dealloc - Fatal编程技术网

Objective c 关于dealoc调用的混淆

Objective c 关于dealoc调用的混淆,objective-c,cocoa,dealloc,Objective C,Cocoa,Dealloc,我这里有一个基本问题 我知道当对象的引用计数变为零时会调用dealloc,dealloc会释放对象所持有的所有资源或释放内存,对吗 如果我们向该对象发送释放消息,对象引用计数将变为零,对吗 让我们考虑下面的对象,其属性创建为, @property (retain) NSString* myString;//reference count 1 和Dealoc [myString release];//reference count 0 [super dealloc]; 我不会在任何地方释放my

我这里有一个基本问题

我知道当对象的引用计数变为零时会调用dealloc,dealloc会释放对象所持有的所有资源或释放内存,对吗

如果我们向该对象发送释放消息,对象引用计数将变为零,对吗

让我们考虑下面的对象,其属性创建为,

@property (retain) NSString* myString;//reference count 1
和Dealoc

[myString release];//reference count 0
[super dealloc];
我不会在任何地方释放
myString
对象,dealloc除外

我的问题是谁将
myString
对象引用计数设为零以便调用dealloc


请澄清我的疑问。

任何保持该对象所有权的东西都有责任释放该对象。例如,如果您发布的代码是保持存储在
myString
中的
NSString
所有权的唯一东西,那么当您调用release时,引用计数将减少,并且对象可能会被解除分配(字符串文本不同)。现在,如果您将
myString
传递给周围或其他请求的
myString
并保留它,那么该代码也负责释放它,这可能是在dealloc方法中释放它之前或之后


我建议参考以加强这一概念。

假设您的属性myString在类MyClass中。您的类的每个实例都被创建并(大概!)发布。当该实例[release]时,将调用MyClass的dealloc方法。您的dealloc依次调用属性上的release,而属性又调用其dealloc,依此类推,直到您使用对象到达此对象堆栈的“底部”。

只有当保留/释放对匹配时,您的对象才会被释放。如果您遵循cocoa内存管理(请参阅apple docs-高级内存管理编程指南)
根据规则,此时您是唯一的“所有者”——运行dealloc zap的最后一次引用——释放对象

使用ARC,消除保留/释放/自动释放和解除锁定。@Zaph:ARC不会消除
dealloc
;它使您不太可能需要覆盖它,但仍有一些情况需要覆盖。
dealloc
不会“将最后一个引用删除”;释放最后一个引用会导致调用
dealloc
。yup-dealloc运行(对obj的最后一个引用,NSString中的NSString已消失)-调用NSString对象(zap)上的release,此时该对象应该没有ref…啊,所以您的意思是对字符串的“zap是最后一个引用”。重要的细节。
发布
不一定会导致
解除锁定
。最后一次
发布
将;平衡先前的
保留
发布
将不会生效。