Объект Objective C ушел из-за управления памятью в NSMutableArray

У меня проблема с управлением памятью при добавлении объектов в 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 находятся вне области видимости, как на этом скриншоте:

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

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

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам