您是否可以描述返回为调用者分配的对象(以及调用者应该释放的对象)的方法与返回自动释放对象的方法之间的命名约定差异?
如果声明具有retain属性的属性,是否需要在将属性设置为nil之前释放该属性?
@synthesize指令有什么作用?
答案 0 :(得分:3)
您只释放或自动释放您拥有的对象。 如果使用名称以“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
将完成工作