iPhone:在方法中返回NSMutableArray,同时仍在释放

iPhone:在方法中返回NSMutableArray,同时仍在释放,iphone,arrays,nsstring,nsmutablearray,Iphone,Arrays,Nsstring,Nsmutablearray,我正试图了解更多关于内存管理的知识。知道我需要发布我已经初始化或分配的任何内容,我对以下内容感到困惑: - (NSMutableArray *)getData { NSMutableArray *data = [[NSMutableArray alloc] init]; NSString *first = @"First object"; [data addObject:first]; NSString *second = @"Second object";

我正试图了解更多关于内存管理的知识。知道我需要发布我已经初始化或分配的任何内容,我对以下内容感到困惑:

- (NSMutableArray *)getData {
    NSMutableArray *data = [[NSMutableArray alloc] init];
    NSString *first = @"First object";
    [data addObject:first];
    NSString *second = @"Second object";
    [data addObject:second];

    return data;

}
由于我使用了alloc和init,我知道我需要释放我的数据对象。但是如果我将autorelease添加到init部分或返回中,则在运行该方法时会崩溃


对于iPhone来说,正确的内存管理方法是什么?

你的思路是正确的。您应该将每个alloc/init与release或autorelease配对,这将导致对象在对它的最终引用消失后立即被清除

模式是这样的:

- (SomeObject*)generateSomeObject
{
    SomeObject* someObject = [[[SomeObject alloc] init] autorelease];
    ...
    return someObject;
}

你在正确的轨道上。您应该将每个alloc/init与release或autorelease配对,这将导致对象在对它的最终引用消失后立即被清除

模式是这样的:

- (SomeObject*)generateSomeObject
{
    SomeObject* someObject = [[[SomeObject alloc] init] autorelease];
    ...
    return someObject;
}

是否将此方法的结果分配给实例变量?请记住,添加到自动释放池中的内容将在将来的某个时间点(通常在运行循环结束时)释放,因此,如果将其分配给实例变量,并且运行循环结束,则除非保留它,否则实例变量将指向垃圾或有时指向其他对象

方法getData的名称会建议返回的对象应该自动删除,因此您可以使用[NSMutableArray array]创建数组,按照常规填充,然后从方法中返回


如果调用getData的代码希望数组在运行循环的迭代中幸存下来,它需要保留数组,但也需要确保在数组最终完成时释放数组-这通常在dealloc方法中完成。

是否将此方法的结果分配给实例变量?请记住,添加到自动释放池中的内容将在将来的某个时间点(通常在运行循环结束时)释放,因此,如果将其分配给实例变量,并且运行循环结束,则除非保留它,否则实例变量将指向垃圾或有时指向其他对象

方法getData的名称会建议返回的对象应该自动删除,因此您可以使用[NSMutableArray array]创建数组,按照常规填充,然后从方法中返回


如果调用getData的代码希望数组在运行循环的迭代中幸存下来,它需要保留它,但也需要确保在数组最终完成时释放它-这通常是在dealloc方法中完成的。

您应该像您所说的那样自动释放。调用者可能需要保留,如下所示-尤其是在存储到实例变量中时:

NSMutableArray *array = [[obj getData] retain];
之后,当它完全完成时:

[array release]; // balances the retain above

你应该像你说的那样自动释放。调用者可能需要保留,如下所示-尤其是在存储到实例变量中时:

NSMutableArray *array = [[obj getData] retain];
之后,当它完全完成时:

[array release]; // balances the retain above

你能发布崩溃的错误消息吗?调用堆栈可能也会有帮助。你能发布崩溃的错误消息吗?调用堆栈可能也会有所帮助。我只是用它从一些对象构建一个数组,这样我就可以将所有代码保存在另一个.m文件中。然后,在我的apps viewDidLoad方法中,我调用返回数组的class方法,然后将其分配给保留的指针。做错了吗?@Nic:如果你保留了它,那么你就是做对了。您确定数组中包含的所有内容都得到了正确的管理吗?请查看上面的帖子,看看哪些内容有效。我必须保留调用方,我只是用它从一些对象构建一个数组,这样我就可以将所有代码保存在另一个.m文件中。然后,在我的apps viewDidLoad方法中,我调用返回数组的class方法,然后将其分配给保留的指针。做错了吗?@Nic:如果你保留了它,那么你就是做对了。您确定数组中包含的所有内容都得到了正确的管理吗?请查看上面的帖子,看看哪些内容有效。我必须保留调用方。我尝试了此操作,但在添加自动释放时崩溃,调试器控制台中没有任何内容。我尝试了此操作,但在添加自动释放时崩溃,调试器控制台中没有任何内容。这很有效,谢谢。但我不明白的是,我把它放到了一个被保留的点上。为什么我需要再次保留?对不起,一个指针。所以我使用@property非原子,retain NSMutableArray*任务;在my.h文件中,如果您有一个带有retain标志的@property,那么只要您实际使用了mutator,就不需要调用retain,因为mutator将为您调用retain。换句话说,这样做:self.missions=[obj getData];而不是:任务=[obj getData]。添加自我。卡尔
这是变异子。如果没有它,您只需分配给ivar,您在@property声明中输入的内容将无关紧要。这很有效,谢谢。但我不明白的是,我把它放到了一个被保留的点上。为什么我需要再次保留?对不起,一个指针。所以我使用@property非原子,retain NSMutableArray*任务;在my.h文件中,如果您有一个带有retain标志的@property,那么只要您实际使用了mutator,就不需要调用retain,因为mutator将为您调用retain。换句话说,这样做:self.missions=[obj getData];而不是:任务=[obj getData]。添加自我。调用变异子。如果没有它,您只需分配给一个ivar,在@property声明中输入什么并不重要。