2009-09-28 76 views
0

请考虑下面的代码:请帮我解决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; 
} 

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

回答

1

dataArray = [CalledClass getData]; 这不会调用属性的retain属性。这只是一个普通的老任务iirc。 [self setDataArray:[CalledClass getData]]会在您的数组上提供2的引用计数。

+0

怎么样self.dataArray的护理= [调用getData]; – rkb 2009-09-28 14:21:59

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中需要保持和释放对象(因为您指定的属性声明“保留”)

+0

因此,如果我不使用autorelease并使用self.dataArray = [CalledClass getData],那么保留计数是多少。我需要释放数据多少次。 – rkb 2009-09-28 01:45:44

+0

[[NSMutableArray alloc] init]将为您提供一个保留数为1的可变数组。self.dataArray = [CalledClass getData]将增加保留数到2.然后您应该释放一次。 – 2009-09-28 02:17:54

+0

Ohkk Tnx Thomas。这意味着如果我不使用自我,那么它不会增加保留计数。 – rkb 2009-09-28 14:22:57