Xcode分析器在dealloc中释放的类变量的潜在泄漏

时间:2014-02-13 09:12:52

标签: objective-c memory-management memory-leaks

以下class声明对我来说似乎没问题。 “name”属性已在dealloc中取消分配。 self.name始终release retain正确。但是Xcode分析仪仍会发出泄漏警告。所以这种风格不对吗?

我是否需要使用[[init] alloc]初始化任何autorelease

self.name = [[[NSString alloc] init] autorelease];

合乎逻辑吗?如果我在这里使用自动释放,那么为什么要在dealloc中释放。即便如此,我也不需要将属性声明为(保留),不是吗?

-

@interface Student : NSObject
@property (nonatomic, retain) NSString *name, *address;
@end

-

@implementation Student
-(id)initWithName:(NSString *)name
{
    self = [super init];
    if (self) {
        self.name = [[NSString alloc] init]; // warning here ... 
        // self.name = @"MyName"; 
    }
    return self;
}
- (void)dealloc{
    [_name release];
    [super dealloc];
}
@end

最好的方法是什么?这样吗?

NSString _n = [[NSString alloc] init]; 
self.name = _n;
[_n release];

3 个答案:

答案 0 :(得分:1)

看到您的[[NSString alloc] init]将创建保留计数1

的对象

然后你通过保留的属性来分配这个对象,从而保留它使保留计数为2

现在在dealloc你发布它,因此保留计数为1

除非你再次释放它,否则它仍在记忆中。

使用财产的正确方法是

-(id)initWithName:(NSString *)name
{
    self = [super init];
    if (self) {
        self.name = [[[NSString alloc] init] autorelease];
        self.name = @"MyName";
    }
    return self;
}

-(id)initWithName:(NSString *)name
{
    self = [super init];
    if (self) {
        _name = [[NSString alloc] init];
        self.name = @"MyName";
    }
    return self;
}

-(id)initWithName:(NSString *)name
{
    self = [super init];
    if (self) {
        String *str = [[NSString alloc] init];
        self.name = str;
        [str release];
        self.name = @"MyName";
    }
    return self;
}

答案 1 :(得分:0)

规则规定任何独立对象应在创建它的范围内[自动]释放。 Analyzer遵循此规则,并且不能绑定除init中的任何范围之外的任何其他版本。因此给出警告。

您应该自动释放已分配的对象,或使用ARC。它真的简化了一切。

答案 2 :(得分:-2)

在init方法中为property赋值的最佳方法是使用ivar。使用setter可能很危险。同时将自动释放对象分配给ivar是错误的,因为当NSAutoreleasePool耗尽时它将被释放。所以正确的方法是:

-(id)initWithName:(NSString *)name
{
    self = [super init];
    if (self) {
        _name = [@"MyName" copy];
    }
    return self;
}