是否有必要在dealloc中释放此对象?

时间:2012-06-11 12:09:46

标签: iphone release autorelease dealloc

我有一个问题。在我的.h:

NSString *string;

@property(nonatomic, retain)NSString *string;

在我的.m:

string=[NSString stringWithFormat:@"%@", otherStringWithValue];

好的,“stringWithFormat”是一种自动释放方法。我需要在dealloc发布“string”吗?

6 个答案:

答案 0 :(得分:1)

只有self.string = ....才会保留你的stringWithFormat。

所以你不需要释放它。但请注意,当您稍后尝试访问它时,您的字符串将被释放并且您的应用程序会崩溃。如果你想保持你的字符串,那么

self.string = .....

并在dealloc上发布

答案 1 :(得分:0)

如果您声明的字符串是上述代码中属性的一部分,那么是,即使您必须初始化它。所有权仍由您自己处理。

答案 2 :(得分:0)

属性仅应用于属性。 无法直接访问属性。它可以通过“。”访问。仅

所以,当你写作时,

string=[NSString stringWithFormat:@"%@", otherStringWithValue];

您正在访问变量。因此,不会对其进行任何保留。此外,stringWithFormat将返回自动释放的对象。因此,无需在dealloc中释放它。但是,您无法在范围之外访问此变量,因为您不知道它何时会被释放。

如果你写,

self.string=[NSString stringWithFormat:@"%@", otherStringWithValue];

您正在访问财产,其价值将被保留。所以,你必须在dealloc方法中释放它。

答案 3 :(得分:0)

只需使用ARC。

严重。这意味着您不再需要担心保留/释放(尽管您不必担心参考周期,无论如何您都不必担心)。

如果你没有使用ARC,那么上面的代码崩溃了,因为你没有取得字符串的“所有权”(保留它)。要么正确保留它:

[string release];
string=[[NSString stringWithFormat:@"%@", otherStringWithValue] retain];

或者使用setter(如果它是自动生成的)将正确保留它:

self.string=[NSString stringWithFormat:@"%@", otherStringWithValue];

-dealloc中,您必须释放ivar,或者您可以使用setter(它将自动为您释放):

self.string = nil;

在ARC之前,我的经验法则是几乎总是使用属性语法,因为它只做正确的事情。

答案 4 :(得分:0)

而不是:

 string=[NSString stringWithFormat:@"%@", otherStringWithValue];

这样做:

 self.string=[NSString stringWithFormat:@"%@", otherStringWithValue];

现在,您需要在dealloc中释放字符串。虽然,+ stringWithFormat返回自动重定向的对象,但你已经声明了一个保留属性,所以你负责释放它。

答案 5 :(得分:-2)

此代码将引入内存泄漏,因为stringWithFormat返回autorelease对象并且您有保留字符串,因此当您为stringWithFormat赋值字符串时,它将提供新的自动释放对象。但是为字符串保留的任何内存仍然存在,因为它保留count仍然是1,所以它不会被释放。但如果你试图释放字符串,它会崩溃,因为在赋值后它将包含autorelease对象。