我想了解下面的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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top