请帮助我解决iPhone中的保留神秘感?

时间:2009-09-28 00:30:32

标签: iphone

请考虑以下代码:

//CallerClass.h
@interface CallerClass : UITableViewController {

    NSMutableArray *dataArray;

}
@property(nonatomic,retain) NSMutableArray *dataArray;
-(void) setData;

//CallerClass.m
@implementation CallerClass
@synthesize dataArray;

-(id)initWithStyle:(UITableViewStyle)style {

    if (self = [super initWithStyle:style]) {
    [self setData];
   }
    return self;
}

-(void) setData
{
   dataArray = [CalledClass getData];
   [dataArray release];

}


//CalledClass.h
@interface CalledClass : NSObject {

}
+(NSMutableArray*) getData;

//CalledClass.m
@implementation CalledClass

+(NSMutableArray*) getData
{
   NSMutableArray* tempArray = [[NSMutableArray alloc] init];
   return tempArray;
}

我想知道tempArray的dataArray的保留计数是多少。它是否被释放。我不想使用autorelease,因为我不知道,直到我需要它的时间段。所以我想自己发布它。当我分配tempArray时,它的保留计数变为1.但是当我将它分配给其属性为retain的实例变量dataArray时,该数组的保留计数是2还是保持为1.就像释放dataArray一样,它会释放内存。

2 个答案:

答案 0 :(得分:2)

您已设置属性以保留该值,但之后您不使用访问器方法,而是直接设置实例变量:

dataArray = [CalledClass getData];

不会为您管理保留计数。你必须使用:

self.dataArray = [CalledClass getData];

此外,在您的CalledClass中,我将getData方法更改为:

+(NSMutableArray*) getData
{
   NSMutableArray* tempArray = [[NSMutableArray alloc] init];
   return [tempArray autorelease];
}

通常情况下,我希望从类似名称的方法中获取一个自动释放的对象。

setData:应该是这样的:

-(void) setData
{
   self.dataArray = [CalledClass getData];
}

或者你可以完全摆脱它而只是直接做

self.dataArray = [CalledClass getData]
在initWithStyle中的

:。

通过调用self.dataArray而不是直接分配给实例变量,dataArray属性将负责保留和释放对象(因为您在属性声明中指定了“retain”)

答案 1 :(得分:1)

  

dataArray = [CalledClass getData];   这不会调用属性的retain属性。那只是简单的旧任务iirc。 [self setDataArray:[CalledClass getData]]会在数组上提供2的引用计数。