要发布哪些属性,哪些不是?

时间:2011-09-11 10:50:24

标签: ios memory-management nsstring interface-builder

在我的应用中,我在h文件中定义了一些属性。

据我了解,如果有一个属性在m文件中的某个位置获得“alloc”,我应该在dealloc方法中释放它(或之前如果它不再相关)。

我不清楚没有得到“alloc”的属性:

  • NSString - 我应该发布它们吗(我看过说“是”的帖子和说“不”的帖子)
  • NSDictionary / NSArray - 当我创建它们时,我不使用“alloc”,而是使用一些arrayWith或dictionaryWith方法;他们是否得到需要发布的内存分配,或者我可以假设XCode正在处理他们的数据管理吗?
  • BOOL - 只是想验证我不需要发布它们
  • int - 只是想验证我不需要发布它们
  • UI项目(如UIButton,UILabel等......) - 这些项目在IB中连接,我没有代码中的“alloc” - 是IB发布它们或者我应该自己做吗?
  • 属性属性如何影响内存管理要求?复制/保留/分配/非原子(我明白,当我“复制”时,我正在创建另一个副本,因此可以配置更多的内存,但我看到的示例代码在某些情况下会释放复制的属性属性,在某些情况下不会) / LI>

我不介意阅读另一个教程(在大多数情况下,当我询问有关内存管理的问题时,我会让人们向我发送Apple内存管理指南的链接),但是如果有人可以解释它或者可以指向比苹果提出的更多的vivide / clear教程我会非常感激。

2 个答案:

答案 0 :(得分:1)

@"some string"autoreleased。别担心这些。当您将其传递给对象时,如viewController.title = @"some string";,该字符串将由另一个对象保留和管理。

有两种方法可以创建NSSetNSArrayNSDictionary。 您可以使用allocinit,也可以稍后使用release,或使用返回+arrayWith...对象的autoreleased方法。

不要担心原始数据类型,例如BOOLint s。

retain值为属性的属性,基本上它们确保对象保留在内存中,直到它们再次release为止。你大多使用retain来表示任何类型的对象,但要注意retain cycles

答案 1 :(得分:1)

这个问题有很多答案,正如你所说,你已经阅读了内存管理教程,但我想你正在寻找的是一个很好的例子,让你清楚地了解它。

我读过的关于Cocoa内存管理的最有用的解释是在Hillegass的书(Mac OS X的Cocoa Programming)中,他将对象描述为像狗一样。每当您使用其中一种方法来增加保留计数(newcopyretaininit时,我一定会忘记一些,这些都在你已经读过的记忆管理指南)然后你又将另一个领先优势放在狗的脖子上

我现在将这个非常好的比喻用于愚蠢的极端。你问了一个生动的例子!

  • 完成后,您必须从狗身上带走任何 导联。否则你会像在National Lampoon's Vacation上那样把它绑在你的车上,这不是很好 - 这是一个内存泄漏

  • 如果你没有对狗进行过攻击,你无法保证它会在你想要它的时候出现。这可能是向已发布的对象发送消息

  • 如果你从狗身上取下头,而且它上面没有任何线索,那么当你过度释放时,那只狗可能会非常野蛮。

所以,从本质上说,如果你在狗身上取得领先,就必须把它脱掉。如果你还没有(即你没有调用newretain等),那么你就没有。这适用于所有对象。 BOOLint不是对象,因此您不必担心它们。

在我的日常编程活动中没有狗受伤