2010-06-09 110 views
0

我很抱歉问这样一个简单的问题,但这是一个我无法找到答案的具体问题。iPhone上的内存管理

我不是原生的Objective-C程序员,所以我很抱歉如果我使用任何C#术语!

如果我在test.h

@interface test : something { 
    NSString *_testString; 
} 

定义一个对象,然后初始化它test.m

-(id)init { 
    _testString = [[NSString alloc] initWithString:@"hello"]; 
} 

后来我明白,我会释放它的dealloc中,因为每个INIT应该有一个版本

-(void)dealloc { 
    [_testString release]; 
} 

但是,我需要澄清的是如果在init中会发生什么,我使用其中的一个e创建对象的快捷方法,我仍然在dealloc中释放它吗?这不会打破“一个初始化的一个版本”规则吗?例如

-(id)init { 
    _testString = [NSString stringWithString:@"hello"]; 
} 

回答

1

如果你设定一个自动的属性,该属性的对象可以随时死去超越眼前的范围。便捷方法,即以类型:字符串,数组,字典等开头的方法返回自动释放对象。当你不关心它们是否超过目前的范围时,你只能使用自动释放的对象。

在这种情况下,您真正​​需要做的是使用访问器(合成或自定义)来自动管理您的保留。

如果你这样做:

@property(nonatomic, retain) NSString *_testString; // .h 
@synthesize _testString; //.m 

然后在代码中使用的参考形式:

self._testString = [NSString stringWithString:@"hello"]; 

...那么你必须释放_testString的唯一地方是在dealloc中。编译器将创建合成存取器,它将自动为您管理属性存储器。

顺便说一句,你不应该使用下划线的名字。苹果公司保留了自己的名字,所以你可以得到命名冲突。

3

如果它不是用alloc,new,copy,mutableCopy创建的,那么你不负责释放它。

This网站有一些很好的内存管理快速概述。

下面是引自cocoadevcentral:

如果您创建使用 手册页头样式的对象,以后需要 释放对象。您应该 不会手动发布自动发布的 对象,因为如果您这样做,您的应用程序将崩溃 。

0

该规则是如果您创建一个新的,分配,复制或保留它的对象,你需要释放它。不得以任何其他方式创建对象。

因此,在您的具体情况下,您不需要释放使用stringWithString创建的字符串。

顺便说一句,我会推荐Cocoa and Objective-C: Up and Running书来了解更多关于这样的事情。如果您是Cocoa编程的新手,那么介绍一下。

+0

规则是,如果您使用** new ** alloc或copy **创建对象,或者您保留它**,则需要将其释放。以任何其他方式创建的对象**不得被释放。修复它为你。 – JeremyP 2010-06-09 15:32:17

+0

谢谢。我在你的说明中进行了编辑。 – jcady 2010-06-09 18:08:29

0

在示例的第一部分中,您确实必须在某处为字符串提供发布。

在示例的第二部分,因为它的自动释放,您不需要在dealloc方法中调用额外的版本。这实际上导致你正试图将消息发送到的东西,不再存在崩溃......

6

有一个精致的缩写,记住你有什么释放

NARC - 新的,分配,保留,复制。

+0

不错,我忘记了那个可爱的小首字母缩略词:) – Justin 2010-06-09 14:39:26

2

只是为了澄清一些事情。当你通过N.A.R.C获得一个物体时因为sylvanaar说你确实需要release它。在其他情况下,您将获得一个自动释放的对象,稍后将自动释放该对象。这在你提供的代码中会很糟糕,因为你确实希望这个字符串至少和你的对象一样长。所以你实际上需要做一个明确的retain来保持它对象的活性。

没有直接回答你的问题,而是期待下一个;-)

0

相反,您需要保留您从stringWithString:获得的对象。正如您正确指出的那样,您不拥有该对象,因此不需要释放它。但是因为你不拥有它,所以随时都可以自由消失,如果你幸运的话会让你崩溃(如果你不幸的话,它会是一个非常奇怪的错误)。所以你需要保留这个对象,然后你需要释放它在dealloc

所有这些在memory management guide中都有很好的解释。我建议你多读几遍。这不是很长或很难,一旦你内化它,你永远不会再想。