我对Objective-C中的合成属性有一些疑问.下面是完整的列表,但基本问题是:How does the compiler ensure that the ivars for synthesized properties are properly released, even though my code may or may not include release methods in dealloc?
注:我决定不把这些问题作为单独的问题发布,因为它们是如此密切相关,而且还有一些现有的问题没有真正触及问题的核心.
有些类似的问题:
- Does property retain need a release?
- What's the difference between property and synthesize?
- Question on retain attribute with property and synthesize
Setup:考虑具有单个属性的类:
@interface Person : NSObject
{
NSString * name;
}
@property (nonatomic, retain) name;
@end
Question #1:最基本的情况是:
@implementation Person
@synthesize name;
@end
在这个设置中,我假设每当释放Person
对象时,name
将自动释放.在我看来,编译器只是简单地将[name release]
插入dealloc
方法,就好像是我自己键入的一样.对吗?
Question #2:如果我 Select 为这个类编写自己的dealloc
方法,而我省略了对[name release]
的调用,这会泄漏吗?
@implementation Person
@synthesize name;
- (void)dealloc { [super dealloc]; }
@end
Question #3:如果我 Select 为这个类编写我自己的dealloc
方法,并且我include调用[name release]
,这会导致双重释放吗,因为@synthesize
已经为我处理好了?
@implementation Person
@synthesize name;
- (void)dealloc { [name release]; [super dealloc]; }
@end
Question #4:如果我 Select 为这个类编写自己的属性访问器,但我do not编写自己的dealloc
方法,name
会被泄露吗?
@implementation Person
@dynamic name;
- (void)setName:(NSString *)newName
{
[newName retain];
[name release];
name = newName;
}
@end
Question #5:我有一种感觉(基于经验),上面的none种情况将导致泄漏或双重释放,因为语言设计是为了避免它们.当然,这就提出了"如何"的问题.编译器是否足够聪明,可以跟踪所有可能的情况?如果我做以下事情(请注意,这是一个可笑的例子,只是为了说明我的观点):
void Cleanup(id object) { [object release]; }
@implementation Person
@synthesize name;
- (void)dealloc { Cleanup(name); }
@end
这会欺骗编译器在dealloc
方法中再添加[name release]
吗?