使用自动释放发布,应用程序将崩溃

时间:2014-11-21 01:33:21

标签: ios crash autorelease

我编写了一个名为Album的应用程序(使用无弧形),作为iPhone的本机" Photo"。 我的问题: 1. enter image description here (请查看随附的文件名:1)单击" +"的按钮,然后输入一些字符串并单击"按钮"按钮,应用程序将崩溃。但是如果更改代码来自" NSMutableArray * albumArr = [[[NSMutableArray alloc] init] autorelease];" to" NSMutableArray * albumArr = [[NSMutableArray alloc] init]",该应用程序可以正常工作。但我想我应该使用自动释放来发布。

相关代码: // AlbumDB.m

+ (NSMutableArray *)fetchAlbumData
{
#warning why autorelease crash?
    NSMutableArray *albumArr = [[[NSMutableArray alloc] init] autorelease];
    FMDatabase *db = [FMDatabase databaseWithPath:[self dataBasePath]];

    if ([db open]) {
        NSString *sqlSelect = @"SELECT * FROM ALBUM";
        FMResultSet *result = [db executeQuery:sqlSelect];
        while ([result next]) {
            AlbumModel *albumModel = [[AlbumModel alloc] init];
            albumModel.albumid = [result intForColumn:@"albumid"];
            albumModel.albumName = [result stringForColumn:@"albumName"];
            [albumArr addObject:albumModel];
            [albumModel release];
        }

        [db close];
    }
    return albumArr;
}
  1. enter image description here (请查看随附的文件名:2)在分析代码时,我发现了对象的潜在泄漏。但是在dealloc中,我已经释放了。为什么会发生?
  2. 相关代码: //MainViewController.h

    @property (nonatomic, retain) AlbumModel *editingAlbum;
    

    // MainViewController.m

    - (void)dealloc
    {
        [_albumArr release], _albumArr = nil;
        self.editingAlbum = nil;
        self.detailViewController = nil;
        [super dealloc];
    }
    

1 个答案:

答案 0 :(得分:0)

我认为您应该了解更多有关mrc的信息 在你的第一种情况下,如果是自动释放的albumArr,则意味着当runloop结束时,它将被释放,所以_albumArr在你使用时将为nil,你必须保留它,当你将值设置为_albumArr时。
在第二种情况下,self.editingAlbum = [[AlbumModel alloc] init];它会使editAlbum保留cout == 2.你必须将代码改为这样:
AlbumModel *temp = [[AlbumModel alloc] init]; self.editingAlbum = temp; [temp release];