Почему объекты в моем NSMutableArray теряют свои значения по-видимому без причины? - PullRequest
1 голос
/ 13 декабря 2011

Я испытываю самую странную ошибку здесь, и я надеюсь, что кто-то может мне помочь через это.Я нахожусь в (медленном и болезненном) процессе преобразования моего существующего приложения в ARC.Мое приложение - это базовое приложение для чтения книг, которое использует FMDB для общения с БД.Преобразование прошло нормально, но сейчас происходит сбой, когда я должен загружать имена своих глав tableView.

В моем заголовочном файле я создаю этот массив, который содержит все мои собственные объекты томов:

NSMutableArray * volumes;
}

@property (nonatomic, strong) NSMutableArray * volumes;

У меня все хорошо?В файле .m я синтезирую свою переменную, а затем в viewDidLoad заполняю массив результатом вызова db:

FMDatabase * database = [FMDatabase databaseWithName:name];

FMResultSet * set = [database executeQuery:@"SELECT * FROM book_volumes"];
volumes = [[NSMutableArray alloc] init];

while ([set next]) {
    Volume * v = [[Volume alloc] initWithResultSet:set];
    [volumes addObject:v];
}

В результате массив заполнен 7объекты.Если я посмотрю на значения внутри массива в окне отладчика, они все там, и все пользовательские объекты имеют все свои свойства.

Когда я нажимаю кнопку play, она переходит к numberOfSectionsInTableView :,и если я посмотрю на значения моего массива в то время как в этом методе в первый раз, все значения все еще там.Но когда нажмете кнопку play, он снова перейдет к тому же методу, numberOfSectionsInTableView :.Это правильно?Для вызова numberOfSectionsInTableView: дважды?Если я посмотрю на значения в массиве во время этого второго вызова, все еще будет 7 объектов, но я не могу получить доступ к их значениям.У них еще есть адреса, но, как я ни стараюсь, их нет

Это особенно проблематично, когда мы переходим к cellForRowAtIndexPath :.Он аварийно завершает работу, потому что не может получить доступ к данным об объектах в массиве томов.

Я довольно новичок в ARC, поэтому, возможно, я что-то упускаю, но есть вероятность, что ARC разрешает объекты массивабыть выпущенным слишком рано?

Понятия не имею, что здесь может происходить.Я успешно извлекаю данные из базы данных в массив, а затем каким-то образом они просто исчезают, прежде чем мы приступим к заполнению tableView.

Что мне не хватает?

Спасибо!

ОБНОВЛЕНИЕ:

Так что это все еще не работает, и это все еще сводит меня с ума.Я думал, что приложу скриншот, когда я вхожу в метод numberOfRowsInSection: и все взрывается:

It doesn't make sense!

ОБНОВЛЕНИЕ СНОВА:

Хорошо, такв итоге инструмент преобразования ARC изменил свойства моего пользовательского объекта так, чтобы перед ним стояло __unsafe_unretained.Я хотел бы поймать это раньше.Я взял это и изменил свойство на строку, и ошибка исчезла.

Спасибо всем, кто просмотрел это.

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

Хорошо, так что в итоге инструмент преобразования ARC изменил свойства моего пользовательского объекта, чтобы __unsafe_unretained перед ним.Я хотел бы поймать это раньше.Я взял это и изменил свойство на сильное, и ошибка исчезла.

Спасибо всем, кто просмотрел это.

0 голосов
/ 13 декабря 2011

Попробуйте использовать

self.volumes = [[NSMutableArray alloc] init];

вместо

volumes = [[NSMutableArray alloc] init];
...