iOS单身人士和内存管理

Mat*_*ick 9 iphone singleton cocoa-touch memory-management ios

我确信我缺少对iOS内存管理的一些基本理解,尽管有大量的阅读和搜索,我仍然没有得到它.

我在我的应用程序中使用单例,其中包含有关当前登录的用户的信息,从多个视图控制器访问的信息等.它有多个在整个应用程序中获取和设置的ivars.它们在.h文件中声明和属性如下:

NSString *myString;
Run Code Online (Sandbox Code Playgroud)

并保留如下:

@property (non atomic, retain) NSString *myString;
Run Code Online (Sandbox Code Playgroud)

并在实现中合成.

我得到并在单例中的方法中设置它们的值,如下所示:

myString = @"value";
Run Code Online (Sandbox Code Playgroud)

methodLocalString = myString;
Run Code Online (Sandbox Code Playgroud)

在其他地方我包括单身人士 - 称之为CurrentUser - 我导入它:

#import "CurrentUser.h"     
Run Code Online (Sandbox Code Playgroud)

在单身人士之外我得到并设置如下:

[CurrentUser sharedCurrentUser].myString = @"Bob";
Run Code Online (Sandbox Code Playgroud)

myOutsideString = [CurrentUser sharedCurrentUser].myString;
Run Code Online (Sandbox Code Playgroud)

大部分时间这都很有效,价值适当地从一个获取或设置到另一个.麻烦的是,有时当我以这种方式得到它们时,我发现它们已被释放(崩溃应用程序),NSZombieEnabled感谢告诉我.

我没有得到的是他的发生方式.我认为单身人士从未被释放,因此单身人士的保留属性永远不会被释放.我会注意到这个问题似乎更常见于非真实对象属性,如NSDate和绝对非对象属性,如int和BOOL,这些属性无法保留,但它也会出现在对象属性中.

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

Dav*_*har 14

你的问题是:

我得到并在单例中的方法中设置它们的值,如下所示:

myString = @"value";

直接分配给iVar时,不是使用属性语法(self.myString = @"value"),而是绕过合成的setter方法,这意味着retain永远不会发生.

属性不是魔术.它们只是"."的一些语法糖.访问,以及合成getter/setter方法的能力,以节省您编写自己的单调乏味.

self.myString = @"value";
Run Code Online (Sandbox Code Playgroud)

只是简写

[self setMyString:@"value"];
Run Code Online (Sandbox Code Playgroud)

合成的setMyString方法将执行以下操作:

if (myString != newValue) {
    [myString release];
    myString = [newValue retain];
}
Run Code Online (Sandbox Code Playgroud)

(假设retain在@synthesize上有选项)