используйте автозапуск для выпуска, приложение выйдет из строя

Я пишу приложение (используя no-arc) под названием «Альбом», которое является родным для iPhone «Фото». Мой вопрос: 1. введите описание изображения здесь(пожалуйста, посмотрите имя прикрепленного файла: 1) при нажатии кнопки «+», затем введите строку и нажмите кнопку «сохранить», приложение выйдет из строя. Но если изменить код с «NSMutableArray * albumArr = [[[NSMutableArray alloc] init] autorelease];» на «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. введите описание изображения здесь(посмотрите имя прикрепленного файла: 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];
}

person Liming    schedule 21.11.2014    source источник


Ответы (1)


Я думаю, вам следует узнать больше о mrc.
В вашем первом случае albumArr, если он является автозапуском, это означает, что когда цикл выполнения закончится, он будет выпущен, поэтому _albumArr будет нулевым при использовании, вы должны сохранить его , когда вы устанавливаете значение в _albumArr.
Во втором случае self.editingAlbum = [[AlbumModel alloc] init]; Это приведет к тому, что редактирование альбома будет сохранено cout == 2. Вы должны изменить код следующим образом:
AlbumModel *temp = [[AlbumModel alloc] init]; self.editingAlbum = temp; [temp release];

person Feng Lin    schedule 21.11.2014
comment
Во втором случае, могу ли я использовать другой способ решения? Например: использование фазы self.editingAlbum = [[[AlbumModel alloc] init] autorelease] для решения? - person Liming; 21.11.2014
comment
Это тоже может быть работа. Но автозапуск, обычно используемый возвращаемым значением, вы не можете обработать случай освобождения. - person Feng Lin; 21.11.2014
comment
поэтому _albumArr будет равен нулю, когда вы используете no, он не будет - person newacct; 22.11.2014