2012-06-11 33 views
0

我有一个问题。在我的.h:是否有必要在dealloc中释放此对象?

NSString *string; 

@property(nonatomic, retain)NSString *string; 

在我的.m:

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

好吧, “stringWithFormat” 是一个自动释放方法。我需要在dealloc中释放“string”?

回答

0

如果你声明的字符串是上述代码中属性的一部分,那么是的,即使你必须初始化它。所有权仍然是你的谨慎。

-2

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

+0

谁曾经低估过,你能解释为什么? –

+0

每一句话都是完全错误的。 1)不会有内存泄漏 - 会有相反的,一个悬挂的指针2)属性被声明为保留是无关的,因为他根本没有使用属性3)字符串是autoreleased,这意味着它会得到释放和释放(因为没有人保留它)一段时间后,当你试图发送任何消息到该变量的对象,你会得到未定义的行为,因为指针不再指向有效的对象 – user102008

+0

好吧我同意你的评论,将有悬挂指针。但现在我的问题是财产宣布零售是无关紧要的,因为他根本没有使用该属性,为什么?如果是这样的话,然后分配字符串值,如果我执行[self.string释放]在dealloc,然后根据你不应该坠毁,因为两者都不同。 –

1

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

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

self.string = ..... 

,并释放它的dealloc上

0

的属性应用于唯一的财产。 无法直接访问属性。它可以通过“。”访问。只要。

所以,当你写,

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

您正在访问的变量。所以,不会保留任何内容。另外,stringWithFormat将返回自动释放对象。所以,不需要在dealloc中释放它。然而,你不能在范围之外访问这个变量,因为你不知道它何时会被释放。

如果你写,

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

您正在访问属性和值将被保留。所以,你必须在dealloc方法中释放它。

0

只需使用ARC。

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

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

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

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

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

-dealloc,那么你必须释放实例变量,或者你可以只使用setter方法(它会自动释放你):

self.string = nil; 

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

0

,而不是这样的:

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

做到这一点:

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

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

相关问题