我可以在没有alloc / init的情况下将释放发送到ivar吗?

时间:2013-05-09 11:15:26

标签: objective-c cocoa-touch memory-management retaincount

我有一个NSString属性:

.h文件

@property (nonatomic, retain) NSString *str;

.m文件

@synthesize str;

没有retain count / str的{​​{1}} alloc是什么?我可以在方法中init吗?

5 个答案:

答案 0 :(得分:3)

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

  

基本内存管理规则

     
      
  • 您拥有自己创建的任何对象。
  •   
  • 您可以使用retain来获取对象的所有权。
  •   
  • 当您不再需要它时,您必须放弃您拥有的对象的所有权。
  •   
  • 您不得放弃您不拥有的物品的所有权。
  •   

为了更好地理解内存管理,我将向您推荐苹果文档中的Memory Management Policy

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

我的建议是阅读ARC,这比自己处理内存管理要好得多。正如你自动完成的那样,一旦你想放弃对象的所有权,你就不再需要做[str release];这样的事情了。

答案 1 :(得分:2)

您无法释放尚未分配的对象。

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

答案 2 :(得分:2)

你不应该release一个尚未分配的对象。但是如果你这样做,就意味着你正在向nil对象发送消息。这是安全的,因为发送给nil的邮件不会执行任何操作并返回nilNilNULL00.0

答案 3 :(得分:2)

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

当您使用ARC时,编译器会为您执行此操作。希望它有所帮助。

答案 4 :(得分:1)

作为retained属性,您可以安全地self.str=nil;代替[str release]。 您可以尽可能[str release] {我} release我们自己allocinit而不是init