Как решить проблемы при использовании авто-релиза на iPhone? - PullRequest
0 голосов
/ 11 августа 2011

Моя проблема в том, что я сортирую массив с NSSortDescriptor , но у меня есть некоторые утечки.Я новичок в Objective C, хотя у меня есть опыт работы с C ++, но я не совсем понимаю retain, release и autorelease.Мой сокращенный код выглядит следующим образом:

-(IBAction)sortByDate
{   
    NSSortDescriptor *Descriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObject:Descriptor];

    NSArray *sortedArray =[productListe sortedArrayUsingDescriptors:sortDescriptors];

    [productListe release];
    productListe=nil;
    productListe=[[NSMutableArray alloc]initWithArray:sortedArray];
    [tableViewProduct reloadData];

    NSLog(@"[Descriptor retainCount] =%i",[Descriptor retainCount]);  //(return 2)

    NSLog(@"[sortDescriptors retainCount] =%i",[sortDescriptors retainCount]); //(return 1)

    NSLog(@"[sortedArray retainCount] =%i",[sortedArray retainCount]);//(return 1)
}

In Instruments Я получаю этот список утечек:

NSSortDescriptor     0x80148a0   32   myProject   -[myClass sortByDate]
__NSArrayI           0x80148c0   16   myProject   -[myClass sortByDate]
__NSArrayReverseEnumerator 0x84079c0 16  UIKit    -[UITableView reloadData]
__NSCFArray          0x8015f10   32   Foundation  +[NSArray(NSArray) newWithContentsOf:immutable:]
Malloc 32 Bytes      0x800f330   32   Foundation  +[NSArray(NSArray) newWithContentsOf:immutable:]
__NSArrayI           0xc914e90  352  Foundation   -[NSArray(NSKeyValueSorting) sortedArrayUsingDescriptors:] 

Вот мои вопросы:

  1. Если в моем приложении будут утечки, отклонит ли Apple его из магазина приложений?
  2. Как можно выпустить все объекты без сбоев.
  3. Почему утечка из reloadData приводит к утечке?.
  4. Как я могу отслеживать утечки, такие как утечка Foundation в моем приложении.

Это мое первое приложение и мой первый вопрос на форуме, так что спасибо за все ваши ответы.


спасибо за ответ, это здорово знать, что кто-то может помочь.Я использую инструменты и освобождаю все в нужном месте (я думаю;)), но когда я пытаюсь отсортировать свое табличное представление, происходит сбой приложения (с reloadData и без него).и если вы можете сказать, что означает процент (%) в инструменте?

теперь у меня нет утечек в инструментах (кроме утечки данных перезагрузки, но я думаю, что вы не можете помочь мне в этом), ее картина - это то, что вы можетепосмотрим, что у меня есть, если я использую cmd + shift + A (я не знаю ее названия, извините):

https://lh6.googleusercontent.com/-cjs_IGsE1Vw/TkccLmyAsGI/AAAAAAAAAEA/YrkE9fUS9XA/Capture%252520d%2525E2%252580%252599e%2525CC%252581cran%2525202011-08-14%252520a%2525CC%252580%25252001.48.43.png

я думаю, что "sortDescriptors" автоматически выпущен, но если яне выпускайте это в инструментах, у меня есть 50% -ая утечка ????

думаю, что вы.

Ответы [ 3 ]

4 голосов
/ 11 августа 2011
  1. определенно нет. Но утечки могут вызвать проблемы. Особенно, если пользователь использует его в течение более длительного времени. Apple может отклонить ваше приложение, потому что утечка памяти вызывает сбои.

  2. Вы выделяете память и инициализируете NSSortDescriptor, не освобождая его должным образом после завершения. Правило большого пальца - отпустите его как можно скорее, если оно вам больше не нужно. Получается значение retainCount, равное 2, поскольку вы добавили его в объект NSArray, который при добавлении выдает сообщение сохранения в дескрипторе.

  3. С удачей и вашими способностями определить, где что-то идет не так. Серьезно, используйте Instruments.app с монитором обнаружения утечек и играйте с вашим приложением. Вы можете просмотреть распределение памяти и сохранение / освобождение, включая retainCounts выделенных объектов. Это отличная помощь.

Посмотрите на следы стека, которые приводят к утечкам, идентифицируйте ваши детали и проверьте их на правильное удержание / освобождение.

Комментарий к объектам автоматического выпуска. autorelease добавит запись в текущий объект NSAutoreleasePool на месте. Этот пул будет исчерпан, если вы так говорите, и в начале каждого цикла событий. См. Ссылку класса NSAutoreleasePool для получения дополнительной информации.

Таким образом, он обычно не очищает ваши драгоценные объекты во время обработки метода в вашем основном потоке, поскольку это на некоторое время блокирует ваш основной цикл событий.

Надеюсь, это немного поможет

1 голос
/ 11 августа 2011
  1. Возможно, но только потому, что он одобрен, не означает, что вы не должны закрывать утечки.

  2. Читайте об управлении памятью для Objective-C(Например, Руководство по программированию управления памятью ).

  3. Вы не освобождаете объект, который создается при его вызове.

  4. Запуск сборки / сборки и анализа или использование других инструментов отладки, включенных в XCode, или использование внешних приложений

0 голосов
/ 11 августа 2011

Я не могу ответить на вопрос вашего магазина приложений, но могу рассказать, как найти утечки: запустите статический анализ. LLVM проанализирует ваш код и предоставит вам подробное объяснение причин каждой утечки.

...