Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS单例和内存管理_Iphone_Cocoa Touch_Memory Management_Ios_Singleton - Fatal编程技术网

Iphone iOS单例和内存管理

Iphone iOS单例和内存管理,iphone,cocoa-touch,memory-management,ios,singleton,Iphone,Cocoa Touch,Memory Management,Ios,Singleton,我确信我对iOS内存管理缺乏一些基本的了解,尽管我进行了大量的阅读和搜索,但我仍然没有理解 我在我的应用程序中使用一个单例,其中包含当前登录用户的信息、从多个视图控制器访问的信息等。它有多个IVAR,可在整个应用程序中获取和设置。它们在.h文件中声明和属性如下: NSString *myString; 并且是这样做的: @property (non atomic, retain) NSString *myString; 并在实现中进行了综合 我在singleton中的方法中获取并设置它们的值

我确信我对iOS内存管理缺乏一些基本的了解,尽管我进行了大量的阅读和搜索,但我仍然没有理解

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

NSString *myString;
并且是这样做的:

@property (non atomic, retain) NSString *myString;
并在实现中进行了综合

我在singleton中的方法中获取并设置它们的值,如下所示:

myString = @"value";
[CurrentUser sharedCurrentUser].myString = @"Bob";

在其他地方,我包括singleton——称之为CurrentUser——我导入它:

#import "CurrentUser.h"     
在单身家庭之外,我得到并设置如下:

myString = @"value";
[CurrentUser sharedCurrentUser].myString = @"Bob";

在大多数情况下,这非常有效,值从一个获取或设置适当地保留到另一个获取或设置。问题是,有时候当我用这种方式得到它们时,我发现它们已经被发布了(使应用程序崩溃),感谢NSZombieEnabled告诉我这一点

我不明白他是怎么做到的。我认为单例永远不会被释放,因此单例的保留属性永远不会被释放。我会注意到,这个问题似乎更常见于非真实对象属性,如NSDate,而绝对不是不能保留的对象属性,如int和BOOL,但对象属性也会出现这种情况

我在这里不知道什么?谢谢你的耐心

您的问题是:

我在方法中获取并设置它们的值 在这样的单身家庭中:

myString = @"value";
[CurrentUser sharedCurrentUser].myString = @"Bob";
myString=@“值”

当您直接向iVar赋值时,您没有使用属性语法(
self.myString=@“value”
),而是绕过了合成setter方法,这意味着
retain
永远不会发生

财产不是魔法。它们只是“.”访问的一点语法糖,以及合成getter/setter方法的能力,从而为您节省编写自己的方法的繁琐

self.myString = @"value";
这只是英语的简写

[self setMyString:@"value"];
合成的
setMyString
方法将执行以下操作:

if (myString != newValue) {
    [myString release];
    myString = [newValue retain];
}

(假设@synthesis上的
retain
选项)

您当前的问题是由一个简单的内存管理错误观念造成的,但从长远来看,单例模式只会让您更头疼。

问得好。等待澄清。不要将
retain
NSString
属性一起使用。使用
复制
。感谢您的非复制。这应该适用于所有支持NSCopying的对象,对吗?这里对复制与保留问题进行了很好的讨论:您需要这个,谢谢您的建议。我已经阅读了十多篇关于优缺点的文章,我对自己的选择感到满意。一般来说,iOS应用程序中的单身最终会让你头疼不已。但是,如果你小心的话,你可以使用它们。但是,有一件事您永远不应该做,那就是从您的单例引用UIKit元素。我已经回顾了开发人员在许多项目中使用单例的情况,基本上,每当单例持有对UIKit对象的引用或其他引用UIKit对象的对象时,您最终都会自食其果。内存泄漏工具不会像这样捕获UIKit泄漏,并且会留下一堆难以修复的循环引用。