iOS单身人士和内存管理

时间:2010-11-19 04:24:31

标签: iphone cocoa-touch memory-management ios singleton

我确信我缺少对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,这些属性无法保留,但它也会出现在对象属性中。

我在这里无知的是什么?谢谢你的耐心等待。

2 个答案:

答案 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.你当前的问题是由一个简单的内存管理误解引起的,但单例模式从长远来看只会让你更头疼。