iOS单身人士和内存pipe理

我确定我缺less对iOS内存pipe理的一些基本理解,尽pipe有很多的阅读和search,但我仍然没有得到它。

我在我的应用程序中使用了一个单身人士,其中包含当前login用户的信息,从多个视图控制器访问的信息等。它具有多个在应用程序中获取和设置的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等绝对不属于对象的属性,而且它也发生在对象属性上。

我在这里不知道什么? 并感谢您的耐心。

你的问题是:

我得到并设置他们的价值在这样的单身人士的方法:

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选项)

不要使用单身人士。 你目前的问题是由简单的内存pipe理误解造成的,但单例模式只会让你长期头痛。