iOS Objective-C dealloc方法释放的是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS Objective-C dealloc方法释放的是啥?相关的知识,希望对你有一定的参考价值。

一个对象当我不使用它时,可以release或autorelease,为什么还要在dealloc方法中在释放一次?

你自己不应该 dealloc 任何对象,objective-c 里面通过reference counting来管理memory,当一个对象的 reference counting=0时,系统自动会调用dealloc释放此对象,所以在没有auto reference counting 下,你用release, retain就好了,不用dealloc。

auto reference counting(ARC)
然而现在随着ARC的推广,当你不再用一个对象时,编译器(compiler)会自动检查你的代码,看你是否还需要此对象与否,所以现在连retain,release都不用了,有点类似java里面的garbage collection, 但跟java garbage collection又有不同,因为ARC 不管reference cycles,你需要用week,strong来调整reference cycles,不过这里就不多讲了

总之,推荐使用ARC
参考技术A 如一个对象 A,A 有一个属性 p ,p 也是一个对象,A 还有很多方法。
如果 A 的很多方法都用到了 p 属性,如果在其中一个方法中释放了 p 属性,其它方法使用 p 属性时 p 属性已经不存在了,程序就出错。
那要什么时候释放 p 属性呢?
dealloc 方法会在对象销毁时程序自动调用。
也就是说 当 A 对象被销毁时程序就会自动调用 A 对象的 dealloc 方法,这时在 dealloc 方法中就可以释放 p 属性了。
dealloc 方法中主要用于释放对象的属性。本回答被提问者采纳
参考技术B autorelease 原理:
a.先建立一个autorelease pool
b.对象从这个autorelease pool里面生成。
c.对象生成 之后调用autorelease函数,这个函数的作用仅仅是在autorelease pool中做个标记,让pool记得将来release一下这个对象。
d.程序结束时,pool本身也需要rerlease, 此时pool会把每一个标记为autorelease的对象release一次。如果某个对象此时retain count大于1,这个对象还是没有被销毁。追问

你特么是在哪粘贴的这段话,驴唇不对马嘴。

追答

草泥马 你妹的 煞笔一个

objective-c 类变量:何时调用 dealloc?

【中文标题】objective-c 类变量:何时调用 dealloc?【英文标题】:objective-c class variables: when is dealloc called? 【发布时间】:2009-03-19 06:28:05 【问题描述】:

如果我在Objective-C中声明类变量,内存什么时候释放?

如果我的界面是:

@interface TestClass : NSObject



+ (NSString)instanceCount;

@end

在实现中,我声明:

static NSString instanceCount;

如何释放这个类级变量?即何时在 Objective-C 中为类变量调用 dealloc?

【问题讨论】:

刚在学习Obj-C时遇到了这个问题。苹果似乎暗示没有“类变量”之类的东西,而您在接口中定义的是一个类方法,它与静态变量分开,因此需要在实施。静态变量仅限于实现文件的范围,而不是类本身。也许这是一个小问题,但它让我困惑了一秒钟:developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/… 【参考方案1】:

您的问题的简短回答是:“程序退出时。”

静态变量在程序的最开始分配,在main() 函数开始之前。同样,它们将在您的程序结束时发布,在main() 退出后不久。此内存管理由 Objective-C 运行时处理,这一切都发生在幕后。

如果您尝试监控此行为,您可能不会有太多运气。例如,如果您在自定义类中执行以下操作,然后将该类用作另一个类的静态成员:

- (void)dealloc

    NSLog(@"I am being deallocated");
    [super dealloc];

您永远不会在日志中看到此消息。这有几个原因。一,NSLog() 需要的变量可能已经作为正常关闭过程的一部分被释放。第二,因为运行时系统可以简单地一次性释放所有剩余内存,而无需费心调用dealloc 方法。

如果您的自定义类在其dealloc 方法中做了一些重要的事情,这可能会出现问题。如果是这种情况,请考虑编写一个自定义的 cleanup 方法,在程序退出之前调用这些对象。

【讨论】:

更不用说 dealloc 是一个实例方法,并且可以为类调用 0 或 100 次 嗯,是的,但我在一个对象中考虑这个方法,该对象被用作另一个类的静态成员。我(希望)在我的回答中澄清了这一点。感谢您指出!

以上是关于iOS Objective-C dealloc方法释放的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

-dealloc 方法在拥有数组 dealloc'd 时不被调用...应该吗?

iOSMRC

为啥当我尝试在 ios 7.1 sdk、xcode 5.1 中调用 deallocate 或 release 时出现错误?

《Objective-C 高级编程》 1.2.3节 alloc/retain/release/dealloc 实现——学习总结

没有在 UIViewController 上调用 Deinit,但 Dealloc 是

Mistune 漏洞利用:滥用 Objective-C Runtime 过 PAC