2

我对 Objective-C 和分配/释放对象有点困惑。

如果我这样做:

NSString *myString;

if([someString isEqualToString: @"test1"]){
    myString = @"got 1";
}else{
    myString = @"got 2";
}

我必须myString在那之后释放吗?

与自定义对象相同:

myOwnObject *someObject = [someArray objectAtIndex: 1];

myButton.label1.text = someObject.name;

我必须释放someObject吗?

我问的原因是我在一个方法中遇到了内存泄漏,我找不到它在哪里。所以我试图弄清楚我是否正确地执行了分配/释放的东西。泄漏发生在 NSPlaceholderString 上(我猜它隐藏在我的 NIB 文件中)。

另外 - 如果我有一个对象,请分配它,但只使用一些属性,但在 dealloc 上释放每个属性 - 这会导致内存泄漏吗?

对不起-希望我的问题至少有一些意义:)

谢谢你的帮助!

4

3 回答 3

1

听我说。这是唯一重要的规则。


如果您使用名称中带有“copy”、“alloc”、“new”或“retain”的方法

拥有该对象,并且必须稍后释放或自动释放它。

如果您不这样做:

不!

但是不要期望对象会停留在该范围之外,因为您不拥有它

就是这么简单。


MyClass *foo = [[MyClass alloc] init];
[array addObject:foo];
[foo release];

你使用了“copy”、“retain”、“new”还是“alloc”?是的。释放它。

MyClass *someObject = [someArray objectAtIndex:0];

你使用了“copy”、“retain”、“new”还是“alloc”?不,不要释放它。

如果您有一个需要在其他方法中访问的实例变量

ivar = [[someArray objectAtIndex:0] retain];

然后你保证它会因为你拥有它而坚持下去。

(处理此问题的另一种方法是使用@property (retain)属性,因为您可以这样做self.ivar = someObject并且它会为您保留它。)

但请记住将它们释放-dealloc

于 2010-07-24T18:09:22.173 回答
0

不,您不必释放其中任何一个。我通常release只对象 I alloc,例如这个片段:

NSString *string = [[NSString alloc] initWithFormat:@"%@", something];
// yadda yadda yadda some code...
[string release];
于 2010-07-24T17:41:42.377 回答
0

要回答您的第一个问题,您不需要释放使用 @"" 语法创建的字符串。

在您的第二个示例中,您不必发布someObject. dealloc但是,如果您的类中的方法myOwnObject没有正确释放其所有实例变量,则可能会出现问题。

于 2010-07-24T18:01:52.053 回答