请考虑以下代码:
//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一样,它会释放内存。
答案 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的引用计数。