我有一个问题。在我的.h:
NSString *string;
@property(nonatomic, retain)NSString *string;
在我的.m:
string=[NSString stringWithFormat:@"%@", otherStringWithValue];
好的,“stringWithFormat”是一种自动释放方法。我需要在dealloc发布“string”吗?
答案 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,那么上面的代码崩溃了,因为你没有取得字符串的“所有权”(保留它)。要么正确保留它:
[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对象。