我有个问题。在我的 .h 中:
NSString *string;
@property(nonatomic, retain)NSString *string;
在我的 .m 中:
string=[NSString stringWithFormat:@"%@", otherStringWithValue];
好的,“stringWithFormat”是一个自动释放方法。我需要在 dealloc 中释放“字符串”吗?
我有个问题。在我的 .h 中:
NSString *string;
@property(nonatomic, retain)NSString *string;
在我的 .m 中:
string=[NSString stringWithFormat:@"%@", otherStringWithValue];
好的,“stringWithFormat”是一个自动释放方法。我需要在 dealloc 中释放“字符串”吗?
只有 self.string = .... 会保留你的 stringWithFormat。
所以你不需要释放它。但请注意,当您稍后尝试访问它时,您的字符串将被释放并且您的应用程序会崩溃。如果你想保留你的字符串,那么请
self.string = .....
并在 dealloc 上释放它
而不是这个:
string=[NSString stringWithFormat:@"%@", otherStringWithValue];
做这个:
self.string=[NSString stringWithFormat:@"%@", otherStringWithValue];
现在,您需要释放您的 dealloc 中的字符串。虽然, +stringWithFormat 返回 autorelased 对象,但您已经声明了一个保留属性,因此您有责任释放它。
严重地。这意味着您不再需要担心保留/释放(尽管您确实必须担心引用周期,无论如何您都必须担心)。
如果您没有使用 ARC,那么上面的代码会崩溃,因为您没有获得字符串的“所有权”(通过保留它)。要么正确保留它:
[string release];
string=[[NSString stringWithFormat:@"%@", otherStringWithValue] retain];
或者使用setter,它(如果它是自动生成的)将正确地保留它:
self.string=[NSString stringWithFormat:@"%@", otherStringWithValue];
在-dealloc
中,您必须释放 ivar,或者您可以只使用 setter(它将自动为您释放它):
self.string = nil;
在 ARC 之前,我的经验法则是几乎总是使用属性语法,因为它只是做正确的事。
如果您声明的字符串是上述代码中属性的一部分,那么是的,即使您必须对其进行初始化。所有权仍然由您负责。
属性仅应用于属性。无法直接访问属性。可以通过“.”访问。只要。
所以,当你写作时,
string=[NSString stringWithFormat:@"%@", otherStringWithValue];
您正在访问变量。因此,不会调用任何保留。此外,stringWithFormat
将返回自动释放的对象。所以,不需要在 dealloc 中释放它。但是,您不能在范围之外访问此变量,因为您不知道它何时会被释放。
如果你写,
self.string=[NSString stringWithFormat:@"%@", otherStringWithValue];
您正在访问财产,其价值将被保留。因此,您必须在 dealloc 方法中释放它。
此代码将引入内存泄漏,因为 stringWithFormat 返回自动释放对象并且您有保留字符串,因此当您为字符串分配 stringWithFormat 的值时,它将提供新的自动释放对象。但是您为字符串保留的任何内存仍然存在,因为它的保留计数仍然存在1,所以它不会被释放。但是如果你试图释放字符串,它会崩溃,因为分配后它将包含自动释放对象。