有必要在dealloc中释放这个对象吗?

Posted

技术标签:

【中文标题】有必要在dealloc中释放这个对象吗?【英文标题】:Is it necessary to release this object in dealloc? 【发布时间】:2012-06-11 12:09:45 【问题描述】:

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

NSString *string;

@property(nonatomic, retain)NSString *string;

在我的 .m 中:

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

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

【问题讨论】:

【参考方案1】:

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

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

self.string = .....

并在 dealloc 上释放它

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

所以,当你写作时,

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

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

如果你写,

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

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

【讨论】:

【参考方案4】:

只需使用 ARC。

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

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

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

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

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

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

self.string = nil;

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

【讨论】:

【参考方案5】:

而不是这个:

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

这样做:

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

这里的每一句话都是完全错误的。 1)不会有内存泄漏——相反,会有一个悬空指针 2)该属性被声明为保留是无关紧要的,因为他根本没有使用该属性 3)字符串是自动释放的,这意味着它将得到在方法之后的某个时间释放和解除分配(因为没有人保留它),当您尝试向该变量处的对象发送任何消息时,您将获得未定义的行为,因为指针不再指向有效对象 好的,我同意您的评论,即会有悬空指针。但是现在我的问题是声明为零售的财产是无关紧要的,因为他根本没有使用该财产,为什么?如果是这种情况,那么之后如果我在 dealloc 中执行 [self.string release] 分配字符串值,那么根据你的说法它不应该崩溃,因为两者是不同的。 它没有使用该属性。它直接使用实例变量。你认为财产是什么意思?它只是一个 getter 和 setter。如果综合属性,getter 和 setter 将用于访问实例变量。即self.string 表示stringself.string = foo 表示[string release]; string = [foo retain];,因为您将其设置为保留。在这两种情况下,您都在使用实例变量 string,但在一种情况下它是保留的,而另一种则不是。

以上是关于有必要在dealloc中释放这个对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

是否有必要将对象归零?

iPhone 内存释放问题

将对象设置为 nil 与在 dealloc 中向其发送释放消息有啥区别

iOS Objective-C dealloc方法释放的是啥?

在 dealloc 中调用 self 的方法

释放视图对象