Объект Objective C ушел из-за управления памятью в NSMutableArray - PullRequest
0 голосов
/ 29 января 2012

У меня проблема с управлением памятью при добавлении объектов в NSMutableArray.Странно то, что все хорошо работает для первых 8 объектов, которые я добавляю, но при добавлении 9-го приложения происходит сбой при извлечении этого объекта.

UploadStatus *status = [[UploadStatus alloc] initWithStatus:[NSString stringWithFormat:@"%@: %d", NSLocalizedString(@"uploadPictureSucceeded", @""), pic_id] 
                                                 andImageInProgress:nil 
                                                    imageForSuccess:nil 
                                                     imageForFailed:nil];
[self.delegate notify:status];
[status release];

Это делается в нескольких местах с разными текстами.Но этот объект содержит мой статус, который я отображаю в UITableView.

. В методе делегата notify я добавляю объект UploadStatus к NSMutableArray и перезагружаю UITableView, которыйпоказывает объекты внутри этого массива.

Первые 8 раз, когда я добавляю объект UploadStatus в массив и перезагружаю таблицу, он отображается правильно.Но в 9-й раз я получаю сообщение об ошибке [CFString retain]: сообщение отправлено освобожденному экземпляру 0x5c655c0 .Эта ошибка возникает при перезагрузке таблицы в методе cellForRowAtIndexPath.

Странно то, что всегда показывает, что объекты внутри NSMutableArray находятся вне области видимости, как на этом снимке экрана:

enter image description here

Тем не менее, если я возьму предмет, преобразую его в класс UploadStatus и получу от него status, все пройдет гладко (для первых 8 объектов).

Кто-нибудь знает, почему происходит ошибка после добавления 9-го UploadStatus объекта в NSMutableArray?

Большое спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 29 января 2012

Проблема с этим кодом:

[NSString stringWithFormat:@"%@: %d", NSLocalizedString(@"uploadPictureSucceeded", @""), pic_id]

Вы не сохраняете строку, поэтому она исчезает при следующем выполнении цикла выполнения.Вам повезло с первыми 8. Они по какой-то причине не перезаписываются, или, возможно, какой-то другой объект удерживает их.Но 9-го нет, и вы, наконец, видите результаты ошибки.

Вам необходимо, чтобы объект UploadStatus сохранил эту строку (а затем выпустил ее).

0 голосов
/ 29 января 2012

Замечу, что вы напрямую обращаетесь к своим иварам в этом блоке кода, а не используете средства доступа. Это почти наверняка корень вашей проблемы (это # ​​1 причина проблем управления памятью в ObjC). Переключитесь на аксессоры, и большинство проблем с управлением памятью исчезнут.

Вы также должны запустить статический анализатор (Build> Analyze). Это может пролить свет. Проблема скорее всего не в приведенном выше коде; это где-то, что вы храните что-то, скорее всего, в иваре.

...