题
我想了解下面的getter中发生了什么,这是我目前所理解的:
(1)getter返回一个指向NSString对象的指针。 (2)保留NSString对象,可能是因为我们刚刚给出了一个指向它的指针。 (3)自动释放?什么时候激活,当PlanetClass实例被解除分配(释放)?
// CLASS
@interface PlanetClass : NSObject {
NSString *planetName;
}
- (NSString *)planetName;
- (void)setPlanetName:(NSString *)value;
@end
// GETTER
- (NSString *)planetName{
return[[planetName retain] autorelease];
}
编辑:我认为我对实际保留和后期发布的原因更加困惑。我的理解是,getter只是返回一个指向nil或已经存在的对象的指针(即由setter设置)我想我理解了retain,因为我们正在给出一个指针,我们需要跟踪它,但是怎么样这个版本只是一个故障安全因素,后来忘记发布NSString对象了吗?
实例变量planetName也在我的dealloc方法中释放(见下文)autorelease似乎也在做同样的事情,就在游泳池耗尽之后?
- (void)dealloc {
[planetName release];
[super dealloc];
}
欢呼 - 加里 -
解决方案
让Objective-C作为属性处理它可能是个好主意,让你清理一些实现来保持内存管理,这是可管理的:
@interface PlanetClass : NSObject {
NSString* planetName;
}
@property(nonatomic, retain) NSString* planetName;
@end // PlanetClass
@implementation PlanetClass
@synthesize planetName
//... rest of PlanetClass here
@end // PlanetClass
充足 docs 可用 在线了解更多详情Objective-C属性和 @synthesize
。
内存管理文档
我强烈建议此内容从Apple读取内存管理尝试并帮助理解所有 retain
/ release
hubbub的内容。
其他提示
当autorelease被发送到对象时,它被添加到自动释放池中。当池耗尽时,它会将释放发送到池中的所有对象。因此,当池耗尽时,自动释放池中的任何对象都将被释放
getter方法中的return / autorelease没有做任何事情,你只需返回 planetName
不隶属于 StackOverflow