2010-09-08 52 views
2

嘿,伙计们,再次击败内存管理(死)马抱歉。我知道这个问题已经在SO上多次提出过,但我觉得所有的问题仍然缺乏两条信息。让我提出一些我知道为了挽救每个人的时间。内存管理与视图控制器中的插座和属性

1)当您创建IBOutlet时,您的视图控制器会自动保留此插座。 1a)当你不创建插座时,'框架'(笔尖?)为你释放你的对象(如uilabels或uiviews)。 2)当你做self.myOutlet = nil时,你可以有效地释放出口(假定你正确地合成了你的属性)。这是因为setter释放插座并将其分配给nil。

我不知道是什么:

1)主要问题:如果你做self.myOutlet =零在viewDidUnLoad,你仍然需要做的dealloc在什么?你可以假设viewDidUnload总是在dealloc之前调用吗?(因此你的保留视图被释放?)

2)如果你没有合成该插座的属性,会发生什么?该框架不应该自动释放它吗?(因为你没有retain属性)如果你必须释放它,你怎么做它以及在哪里(在viewDidUnload或dealloc中)?

如果有什么不对,请告诉我。任何澄清都是非常有帮助的。

回答

1

(#1)苹果文档说做到既

另外,由于dealloc中的UIViewController中执行的细节,你还应该设置插座变量为nil在dealloc中:

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html

(#2)如果你不合成的属性,你还需要做出一个属性,它更好地保留 - 阅读的链接。 UI对象被创建,autoreleased和outlet属性被设置(它应该保留)。因为他们已经发布了他们本应该发布的版本 - 你保留了,所以你必须发布(在viewDidUnload和dealloc中)

+0

hi lou,谢谢你的回复: – Ying 2010-09-09 12:50:48

+0

hi lou,感谢您的回应:我很困惑,因为关于在dealloc中将outlet变量设置为零的引用在本节中是这样说的: “注意:在3.0之前的iOS中...您应该在setView:中将网点设置为零在这个例子中举例说明:“ 然后它说,就像你上面引用的那样,”另外....“那么这是不是iOS 3.0前的细节的一部分? 所以我从这里拿走了,当你有一个保留的属性,在viewDidUnload和dealloc期间,你必须做self.outlet = nil,没有其他东西来正确管理属性。没有物业没有物业。这是正确的吗? – Ying 2010-09-09 13:01:46

+0

我对该说明的阅读是,只有setView部分适用于iOS 3.0,因为viewDidUnload不存在。第二部分是针对每个版本的。是的,为IBOutlets使用@property。 – 2010-09-09 20:33:35

相关问题