2012-05-20 1 views
0

У меня есть просочившийся объект в следующем коде. Как это исправить? Я попытался добавить [apiViewController release]; но когда я анализирую приложение я все еще получаю:Как исправить просочившийся объект с сохранением числа +1?

enter image description here

if (idx == 2) { 
     NSLog(@"you touched menu 2"); 

     APICallsViewController *apiViewController = [APICallsViewController alloc]; 
     [self.navigationController pushViewController:apiViewController animated:YES]; 
     //[apiViewController getFriendsCallAPIDialogFeed]; 
     [apiViewController getAppUsersFriendsUsing]; 


    } 

спасибо за любую помощь

+2

Вы не знаете, что делаете. Найдите хорошую ссылку на управление кучей iOS и изучите ее. –

+0

Некоторые из них описаны в [Расширенное управление памятью] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html). – Rob

ответ

3

Вы забываете о -init, и -release.

APICallsViewController *apiViewController = [[APICallsViewController alloc] init]; 
... 
[apiViewController release]; 

Возможно, вам стоит прочитать на Objective-C programming.

0

Для каждого объекта вы Alloc/сохранить, вы responcible для освобождения.

После

[apiViewController getAppUsersFriendsUsing]; 

Пут ...

[apiViewController release]; 
1

Во-первых, вам нужен init, как hwaxxer и Justin Boo.

Во-вторых, несколько человек предложили использовать autorelease. autorelease является отложенным release, и вы, как правило, не должны этого делать, если вам не нужно (например, ваш метод должен отложить выпуск до тех пор, пока он не сможет вернуть объект своему вызывающему абоненту). Короче говоря, используйте только autorelease, когда вы возвращаете объект вызывающему, и в противном случае используйте release. В этом случае вы должны использовать release.

В этом конкретном случае это не имеет значения (потому что, нажав контроллер вида, он все равно сохраняется и не будет выпущен до тех пор, пока этот вид не выскочит со стека), но если вы собираетесь делать (т. е. не использовать ARC), стоит использовать хорошую практику, а именно release всякий раз, когда вы можете (например, в этом случае), и только autorelease, когда вы возвращаете объект вызывающему абоненту метода и поэтому должны отложить release.

В-третьих, я предлагаю прочитать и убедиться, что вы понимаете Advanced Memory Management. Это дает вам некоторые основные правила управления памятью, которые вам действительно нужно понять (например, если вы их создаете, тогда вы владеете им, и вы должны его отпустить).

В-четвертых, как только вы овладеете навыками управления памятью (и только после того, как вы это сделаете, так как полезно понять, что происходит), я бы предложил серьезно рассмотреть Transitioning to ARC, потому что вам не нужно много разбираться этой глупости.