我对iPhone程序中的dealloc功能有一些疑问。是否要求[self.object_name release]或[object_name release]是否正常? 我的dealloc函数中的这个奇怪的问题是这样的。
-(void) dealloc {
[self.listOfDates release];
[self.listOfDescriptions release];
[super dealloc];
}
但程序崩溃给出EXEC_BAD_ACCESS。这两个对象都是NSMutableArray实例,它们在类的init函数中使用alloc分配。没有自我的相同功能正常工作,即
-(void) dealloc {
[listOfDates release];
[listOfDescription release];
[super dealloc];
}
以下是我如何声明属性
@property (nonatomic,retain) NSMutableArray *listOfDates;
@property (nonatomic,retain) NSMutableArray *listOfDescription;
在实现文件中我对此进行了sysnthesized,在init函数内部我已经分配了这些变量
self.listOfDates = [[NSMutableArray alloc] init];
self.listOfDescription = [[NSMutableArray alloc] init];
所以需要给自己吗?我在这里缺少什么?
当我删除mutableCopy函数时解决了问题,我曾用它来复制NSMutableArrays的实例,该函数作为参数传递给init函数,如下所示
-(id)initWithDate:(NSMutableArray *)dates andDescription:(NSMutableArray*)descriptions
{
if(self = [super initWithNibName:@"DateDescriptionControl" bundle:nil])
{
self.listOfDates = [[NSMutableArray alloc] init];
self.listOfDescription = [[NSMutableArray alloc] init];
self.listOfDates = [dates mutableCopy];
self.listOfDescription = [description mutableCopy];
}
return self;
}
删除mutableCopy后,dealloc现在不会抛出EXEC_BAD_ACCESS。那么我在哪里弄错了我仍然无法弄明白:(
答案 0 :(得分:2)
self。
答案 1 :(得分:2)
在dealloc中你有两个选择:
[foobar release];
或
self.foobar = nil;
第二个等同于写[self setFoobar:nil]
并且它在setFoobar中:方法是释放前一个值的地方(假设该属性被定义为使用retain或copy)。我倾向于选择第一种形式,您只需将release
直接发送到对象,但其中任何一种都可以。
写[self.foobar release]
在技术上应该没问题,但如果你以后再调用self.foobar = nil
,对象将被第二次释放(并导致EXC_BAD_ACCESS)。
答案 2 :(得分:0)
self.something
表示[self something]
,因为点表示属性语法。你想要的是self->something
。
答案 3 :(得分:0)
是,
[对象释放];
应该可以正常工作。
答案 4 :(得分:0)
您遇到的基本问题是由此代码引起的:
self.listOfDates = [[NSMutableArray alloc] init];
当属性为“retain”并且您通过setter访问它时,分配给它的对象应该在autorelease池中,如下所示:
self.listOfDates = [[[NSMutableArray alloc] init] autorelease];
但是,这有点难看,NSMutableArray提供了一个很好的构造函数,可以自动为你完成:
self.listOfDates = [NSMutableArray array];
您的代码未使用ARC,因此该对象应位于自动释放池中。如果你使用的是ARC,那么规则就会有所不同。
答案 5 :(得分:0)
最佳实践(非ARC)。 在你的Interface Declare Varibal中,如下所示
NSMutableArray *_listOfDates;
NSMutableArray *_listOfDescription;
你的塞特犬应该在下面。 (和你的代码一样)
@property (nonatomic,retain) NSMutableArray *listOfDates;
@property (nonatomic,retain) NSMutableArray *listOfDescription;
在您的实施中
@synthesize listOfDates = _listOfDates, listOfDescription = _listOfDescription;
初始化
-(id)initWithDate:(NSMutableArray *)dates andDescription:(NSMutableArray*)descriptions
{
if(self = [super initWithNibName:@"DateDescriptionControl" bundle:nil])
{
NSMutableArray *tempListOfDates = [[NSMutableArray alloc] init];
self.listOfDates = tempListOfDates;
[tempListOfDates release];
NSMutableArray *tempListOfDescription = [[NSMutableArray alloc] init];
self.listOfDescription = tempListOfDescription;
[tempListOfDescription release];
}
}
在dealloac
-(void) dealloc {
[_listOfDates release];
[_listOfDescription release];
[super dealloc];
}
答案 6 :(得分:-1)
只需使用[object release]释放实例变量即可。使用“自我”不是必需的。