0

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

NSString *string;

@property(nonatomic, retain)NSString *string;

在我的 .m 中:

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

好的,“stringWithFormat”是一个自动释放方法。我需要在 dealloc 中释放“字符串”吗?

4

6 回答 6

1

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

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

self.string = .....

并在 dealloc 上释放它

于 2012-06-11T12:16:07.343 回答
0

而不是这个:

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

做这个:

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

现在,您需要释放您的 dealloc 中的字符串。虽然, +stringWithFormat 返回 autorelased 对象,但您已经声明了一个保留属性,因此您有责任释放它。

于 2012-06-11T16:18:58.237 回答
0

只需使用 ARC。

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

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

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

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

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

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

self.string = nil;

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

于 2012-06-11T16:12:26.370 回答
0

如果您声明的字符串是上述代码中属性的一部分,那么是的,即使您必须对其进行初始化。所有权仍然由您负责。

于 2012-06-11T12:13:02.013 回答
0

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

所以,当你写作时,

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

您正在访问变量。因此,不会调用任何保留。此外,stringWithFormat将返回自动释放的对象。所以,不需要在 dealloc 中释放它。但是,您不能在范围之外访问此变量,因为您不知道它何时会被释放。

如果你写,

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

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

于 2012-06-11T12:55:46.997 回答
-2

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

于 2012-06-11T12:14:11.243 回答