我有一个问题。在我的.h:是否有必要在dealloc中释放此对象?
NSString *string;
@property(nonatomic, retain)NSString *string;
在我的.m:
string=[NSString stringWithFormat:@"%@", otherStringWithValue];
好吧, “stringWithFormat” 是一个自动释放方法。我需要在dealloc中释放“string”?
我有一个问题。在我的.h:是否有必要在dealloc中释放此对象?
NSString *string;
@property(nonatomic, retain)NSString *string;
在我的.m:
string=[NSString stringWithFormat:@"%@", otherStringWithValue];
好吧, “stringWithFormat” 是一个自动释放方法。我需要在dealloc中释放“string”?
如果你声明的字符串是上述代码中属性的一部分,那么是的,即使你必须初始化它。所有权仍然是你的谨慎。
该代码将引入内存泄漏,因为stringWithFormat返回自动释放的对象,你有保留的字符串,所以当你指定字符串stringWithFormat的值将提供新的自动释放object.But任何记忆你保留字符串仍然存在,因为它的保留计数仍然是1,所以它不会被释放。但是如果你试图释放字符串,它会崩溃,因为分配后它将包含autorelease对象。
只有self.string = ....会保留你的stringWithFormat。
所以你不需要释放它。但要注意,你的字符串将会被释放,并且你的应用程序在以后尝试访问它时会崩溃。如果你想保持你的字符串,以便使
self.string = .....
,并释放它的dealloc上
的属性应用于唯一的财产。 无法直接访问属性。它可以通过“。”访问。只要。
所以,当你写,
string=[NSString stringWithFormat:@"%@", otherStringWithValue];
您正在访问的变量。所以,不会保留任何内容。另外,stringWithFormat
将返回自动释放对象。所以,不需要在dealloc中释放它。然而,你不能在范围之外访问这个变量,因为你不知道它何时会被释放。
如果你写,
self.string=[NSString stringWithFormat:@"%@", otherStringWithValue];
您正在访问属性和值将被保留。所以,你必须在dealloc方法中释放它。
说真的。这意味着您不再需要担心保留/释放(尽管您不必担心参考周期,无论如何您都必须担心)。
如果您没有使用ARC,那么上面的代码会崩溃,因为您没有对该字符串进行“所有权”(通过保留它)。无论正确保留它:
[string release];
string=[[NSString stringWithFormat:@"%@", otherStringWithValue] retain];
或者使用setter,它(如果是自动生成的话)将正确地保留它:
self.string=[NSString stringWithFormat:@"%@", otherStringWithValue];
在-dealloc
,那么你必须释放实例变量,或者你可以只使用setter方法(它会自动释放你):
self.string = nil;
ARC之前,我的经验法则是几乎总是使用属性语法,因为它只是做正确的事情。
,而不是这样的:
string=[NSString stringWithFormat:@"%@", otherStringWithValue];
做到这一点:
self.string=[NSString stringWithFormat:@"%@", otherStringWithValue];
现在,你需要释放字符串中的的dealloc。虽然,+ stringWithFormat返回autorelased对象,但你已经声明了保留属性,所以你有责任释放它。
谁曾经低估过,你能解释为什么? –
每一句话都是完全错误的。 1)不会有内存泄漏 - 会有相反的,一个悬挂的指针2)属性被声明为保留是无关的,因为他根本没有使用属性3)字符串是autoreleased,这意味着它会得到释放和释放(因为没有人保留它)一段时间后,当你试图发送任何消息到该变量的对象,你会得到未定义的行为,因为指针不再指向有效的对象 – user102008
好吧我同意你的评论,将有悬挂指针。但现在我的问题是财产宣布零售是无关紧要的,因为他根本没有使用该属性,为什么?如果是这样的话,然后分配字符串值,如果我执行[self.string释放]在dealloc,然后根据你不应该坠毁,因为两者都不同。 –