2010-03-01 35 views
1

我一直在开发一个应用程序一段时间,现在我已经到了“仪器泄漏”部分。ivars以及如何正确实例化它们的值(iPhone)

我记得有一件事在我学习的几个月前让我对ivars感到困惑。我把所有的事情都放在了信心之上,并且遵循了Apple和其他人的做法。据我所知,由SDK生成的访问器将负责内存管理。

但是,ivars如何初始化?

如果我在我的界面中有这样的ivar;

@interface 
    { 
    NSArray *results; 
    } 

    @property(nonatomic, retain) NSArray *results; 
    @end 

@implementation 
@synthesize results; 

如果我在运行时尝试这样做:

[self setResults:allReadyInitializedArray]; 

它会崩溃,告诉我这个结果对象未初始化。如果我然而这样做:

self.results = [[NSArray alloc] init]; //Im assigning this property memory, but hasn't the SDK already done that? 
[self setResults:allReadyInitializedArray]; 

它会工作,但它会显然泄漏内存。

我的印象是,使用生成的 访问器将释放旧的值,然后设置新的,意思是 上面应该出来的旧值释放和新的+1保留计数。

它是否具体与NSArray/NSMutableArray类型的伊娃有关,我不记得它与其他Ivars一直存在问题。

的问题一直特别突出的在我的XML解析器,在那里我不断地需要设置伊娃值,使用它,覆盖此值,使用新值等

会有人帮我概述正确的方式“从”:@property() - > @synthesize - >使用伊娃 - > dealloc?

我已经阅读了内存管理文档,我试过在我的理解中寻找一些债务文档,但似乎即使我每天都使用ivars,但我不明白后面发生了什么场面。

+1

你在第一次做它的方式看起来正确。你能发布你得到的错误消息的确切文本吗? – kubi 2010-03-01 13:42:19

回答

0

我的理解是,

self.results = anArray; 

相同

[self setResults:anArray]; 

只是因为结果是在这种情况下,一个属性:要删除泄漏一样,你可以重写代码。

setResults的实现方式是由@property设置的(在这种情况下,它将保留新值)。所以这意味着aArray的保留计数为1.设置self.results后,anArray的保留计数为2.这就是为什么要释放以前使用的anArray。这就是说,我不明白为什么setResults:当你设置它崩溃。 (也许它只是当你试图使用self.results,而不是设置它崩溃) 我只是一个初学者我自己,如果有什么问题我强烈鼓励大家谁读这个让我知道什么是错的或正确的。仍然自己学习这个。

的方式,苹果将做到这一点:

在.h文件

@property (nonatomic, retain) NSArray *results 

在.m文件

@synthesize results; 

- (id)init { 
    NSArray *anArray = [[NSArray alloc] init]; // retainCount = 1 
    self.results = anArray;      // retainCount = 2 
    [anArray release];       // retainCount = 1, only one "left" is in self.results 
} 

- (void)dealloc { 
    [results release]; 
} 
+0

嗨CrisB。我发现这写的非常有用:http://www.iphonedevsdk.com/forum/iphone-sdk-tutorials/7295-getters-setters-properties-newbie.html 我做了一个正则表达式(self。* = \ [\ [。* alloc \])对于我的代码中的每个实例,我没有像您和Apple在上面描述的那样执行操作。 (那里有大约120个实例!) 然后,我再次遍历所有代码,并标记了如下操作的发生: “arrayWithArray”并将它们标记为// autorelease。 最后,我在@synthesize下移动了每个dealloc方法,以便更轻松地跟踪一切。 所有这些都让我对ivars有了更好的理解。谢谢 – RickiG 2010-03-02 14:59:04

2

所有ivars最初设置为零,因此您需要在使用前将它们实例化。很难说为什么setResults可能会在没有看到它的实现的情况下产生错误。

self.results = [[NSArray alloc] init]; 

在这里您将使用的alloc方法,新的数组对象 - 其保留数等于1,你的setter方法保留您的数组一次,并让你的第一个对象保留仍然是“未处理”,导致内存泄漏后。

self.results = [[[NSArray alloc] init] autorelease]; 
// or 
self.results = [NSArray arrayWith...]; // any NSArray's convenience method that returns autoreleased object. 
相关问题