我确信我缺少对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,这些属性无法保留,但它也会出现在对象属性中。
我在这里无知的是什么?谢谢你的耐心等待。
答案 0 :(得分:14)
你的问题是:
我在方法中设置了它们的值 像这样的单身人士:
myString = @"value";
当您直接分配给iVar时,不使用属性语法(self.myString = @"value"
),而是绕过合成的setter方法,这意味着retain
永远不会发生。
属性不是魔术。它们只是“。”的一些语法糖。访问,以及合成getter / setter方法的能力,以节省您编写自己的单调乏味。
self.myString = @"value";
只是
的简写[self setMyString:@"value"];
合成的setMyString
方法将执行以下操作:
if (myString != newValue) {
[myString release];
myString = [newValue retain];
}
(假设@synthesize上有retain
选项)
答案 1 :(得分:0)
Don't use singletons.你当前的问题是由一个简单的内存管理误解引起的,但单例模式从长远来看只会让你更头疼。