【发布时间】:2010-11-19 04:24:31
【问题描述】:
我确信我缺少对 iOS 内存管理的一些基本了解,尽管阅读和搜索了很多内容,但我仍然没有得到它。
我在我的应用程序中使用了一个单例,其中包含有关当前登录到其中的用户的信息、从多个视图控制器访问的信息等。它具有在整个应用程序中获取和设置的多个 ivars。它们在 .h 文件中声明和属性,如下所示:
NSString *myString;
并像这样保留:
@property (non atomic, retain) NSString *myString;
并在实现中综合。
我在单例中的方法中获取和设置它们的值,如下所示:
myString = @"value";
和
methodLocalString = myString;
在其他地方我包含了单例——称之为 CurrentUser——我将其导入:
#import "CurrentUser.h"
在单例之外我得到并设置它是这样的:
[CurrentUser sharedCurrentUser].myString = @"Bob";
和
myOutsideString = [CurrentUser sharedCurrentUser].myString;
大多数情况下,这很有效,从一个获取或设置到另一个的值适当地持久化。问题是,有时当我以这种方式获取它们时,我发现它们已被释放(使应用程序崩溃),谢天谢地,NSZombieEnabled 告诉了我。
我不明白他是如何发生的。我认为单例永远不会被释放,因此单例的保留属性永远不会被释放。我会注意到这个问题似乎更常见于非真实对象属性(如 NSDate)和绝对非对象属性(如不能保留的 int 和 BOOL),但对象属性也会发生这种情况。
我在这里有什么不知道的?感谢您的耐心等待。
【问题讨论】:
-
好问题。等待澄清。
-
不要将
retain与NSString属性一起使用。使用copy。 -
感谢您的非副本。这应该适用于所有支持 NSCopying 的对象,对吧?
-
在这里很好地讨论了复制与保留问题:stackoverflow.com/questions/387959/…
标签: iphone cocoa-touch memory-management ios singleton