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

Ios 使用自动释放释放,应用程序将崩溃,ios,crash,autorelease,Ios,Crash,Autorelease,我编写了一个名为Album的应用程序(不使用arc),它是iPhone的原生“照片”。 我的问题: 1. (请查看附件文件名:1)点击“+”按钮,然后输入一些字符串并点击“保存”按钮时,应用程序将崩溃。但如果将代码从“NSMutableArray*AlbumArray=[[[NSMutableArray alloc]init]autorelease];”更改为“NSMutableArray*AlbumArray=[[NSMutableArray alloc]init]”,该应用程序可以正常工作。

我编写了一个名为Album的应用程序(不使用arc),它是iPhone的原生“照片”。 我的问题: 1. (请查看附件文件名:1)点击“+”按钮,然后输入一些字符串并点击“保存”按钮时,应用程序将崩溃。但如果将代码从“NSMutableArray*AlbumArray=[[[NSMutableArray alloc]init]autorelease];”更改为“NSMutableArray*AlbumArray=[[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;
}
  • (请查看随附文件名:2)在分析代码时,我发现了一个对象的潜在泄漏。但在dealloc中,我已经发布了。为什么会发生这种情况
  • 相关代码: //MainViewController.h

    @property (nonatomic, retain) AlbumModel *editingAlbum;
    
    //MainViewController.m

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

    我认为你应该更多地了解mrc。

    在第一种情况下,albumArr如果是autorelease,则意味着当runloop结束时,它将被释放,因此当您使用时,\u albumArr将为零,当您将值设置为\u albumArr时,您必须保留它。
    在第二种情况下,self.editingAlbum=[[AlbumModel alloc]init];它将导致编辑album retain cout==2。您必须将代码更改为这样:
    AlbumModel*temp=[[AlbumModel alloc]init];
    self.editingAlbum=温度;
    
    [临时释放]

    在第二种情况下,我是否可以使用其他方法来解决?例如:使用“self.editingAlbum=[[[AlbumModel alloc]init]autorelease]的阶段来解决?它也可以工作。但是自动释放通常由返回值使用,您无法处理dealloc情况。”因此,当您使用“否”时,\u albumArr将为零