0

我有一个NSString财产:

.h 文件

@property (nonatomic, retain) NSString *str;

.m 文件

@synthesize str;

没有/retain count是什么?我可以在一个方法?strallocinit[str release]

4

5 回答 5

3

我假设您对内存管理的概念不熟悉,因此我建议您在继续开发之前阅读有关内存管理的苹果文档。

基本内存管理规则

  • 您拥有您创建的任何对象。
  • 您可以使用保留获得对象的所有权。
  • 当您不再需要它时,您必须放弃您拥有的对象的所有权。
  • 您不得放弃您不拥有的对象的所有权。

我将向您推荐苹果文档中的内存管理策略,以便更好地理解内存管理

因此,当您阅读了苹果文档时,您将完全理解代码中发生的事情,但如果您不这样做,那就是错误的。您不能释放您没有所有权的对象。这违反了苹果文档中基本内存管理规则的第 4 点。要获得此对象的所有权,您必须str = [[NSString alloc] init];在 .m 文件中执行(ARC 不需要此操作)。

不过,我的建议是阅读有关ARC的信息,这比自己处理内存管理要好得多。因为您不再需要做一些事情,例如[str release];一旦您想放弃对象的所有权,因为它是自动完成的。

于 2013-05-09T11:37:02.660 回答
2

release不应该有一个尚未分配的对象。但是,如果您这样做,则意味着您正在向对象发送消息nil。这是安全的,因为消息 tonil什么都不做并返回nil, Nil, NULL, 0, or 0.0

于 2013-05-09T11:23:07.603 回答
2

是的,您可以释放此对象。每当您将alloc, copy, new, retain这些消息中的任何一个发送到对象时。它的保留计数增加了 1。您成为该对象的所有者。因此,您必须释放对象以放弃所有权。

当您使用 ARC 时,编译器会为您执行此操作。希望能帮助到你。

于 2013-05-09T11:23:35.590 回答
2

您不能释放尚未分配的对象。

尽可能使用 ARC,并阅读过去 2 年对 Objective-C 的更改:不再需要在 .m 中合成在 .h 中声明的变量

于 2013-05-09T11:17:17.230 回答
1

作为它的一个retained属性,你可以做self.str=nil;而不是[str release]安全。你不能[str release]像我们一样release只能做我们自己做的事情alloc,但initinit没有。

于 2013-05-09T11:37:39.170 回答