Объект 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). Это может пролить свет. Проблема, вероятно, не в приведенном выше коде; это где-то, что вы храните что-то, скорее всего, в иваре.