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理误解造成的,但单例模式只会让你长期头痛。