iPhone内存发布问题

时间:2010-01-11 09:05:18

标签: iphone

我对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。那么我在哪里弄错了我仍然无法弄明白:(

7 个答案:

答案 0 :(得分:2)

在dealloc函数中释放不需要

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]释放实例变量即可。使用“自我”不是必需的。