你怎么知道你是否需要释放一个物体?

时间:2010-10-15 18:49:41

标签: objective-c cocoa ios4

您是否可以描述返回为调用者分配的对象(以及调用者应该释放的对象)的方法与返回自动释放对象的方法之间的命名约定差异?

如果声明具有retain属性的属性,是否需要在将属性设置为nil之前释放该属性?

@synthesize指令有什么作用?

3 个答案:

答案 0 :(得分:3)

来自apple documentation

  

您只释放或自动释放您拥有的对象。   如果使用名称以“alloc”或“new”开头或包含“copy”(例如,alloc,newObject或mutableCopy)的方法创建对象,或者向其发送保留消息,则获取对象的所有权。

     

您使用release或autorelease放弃对象的所有权。 autorelease只是意味着“将来发送一条发布消息”(了解这将是什么时候,请参阅“Autorelease Pools”)。

你的第二个问题是相关的。 @synthesize所做的就是为您的实现文件生成其他方法。 @property的参数(nonatomic,retain)NSString * myString;定义生成的方法的行为。例如,如果将属性声明为retain,则setMyString生成的方法将保留其参数。

Nonatomic非常重要,因为默认情况下,属性是线程安全的。如果您不需要线程安全性,则可以在访问器方法中消除大量开销。

最后,保留属性的实现是

- (void) setMyString:(NSString*)newString {
    [newString retain];
    [myString release];
    myString = newString;
}

所以,说self.myString = nil会有效地释放myString。许多人提倡使用self.property = nil来保留属性,而不是[属性发布],尽管我认为这只取决于个人偏好。

答案 1 :(得分:1)

答案 2 :(得分:1)

Aaron在下面列出了一个很好的内存分配来源。

关于@synthesize

假设您有一个属性P,您需要做的就是为它编写一个getter和一个setter。有一些常见的方法,其中之一是在设置该属性并释放旧值时保留该对象。 E.g:

- (void)setP:(PClass *)value
{
  [value retain];
  [_pInstanceVariable release];
  _pInstanceVariable = value;
}

由于这是一段非常常见的代码,如果您在属性声明中指定retain关键字,然后在实现中执行@synthesize,编译器可以为您自动执行此操作。编译器将生成上面提到的代码,这意味着您的代码将更加清晰,无需繁琐的重复部分。

同样适用于吸气剂,除非你想要比以下更复杂的东西:

- (PClass *)p
{
  return _pInstanceVariable;
}

@synthesize将完成工作