2011-01-29 2 views
0

Я новичок в программировании на iPhone. Я создал приложение на основе окон. Ниже приведен мой код:iphone application crashed

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    UILabel *myLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(50, 200, 200, 80)]; 
    myLabel1.text = @"Prasad"; 
    NSLog(@"myLabel retain Count: %d\n", [myLabel1 retainCount]); 
    [myLabel1 release]; 
    NSLog(@"myLabel retain Count: %d\n", [myLabel1 retainCount]); 
    [window makeKeyAndVisible]; 
    return YES; 
} 

Q1. Когда я освобождаю mylabel1, инструкция NSLog, следующая за инструкцией по выпуску, все равно печатает saveCount как 1, тогда как в идеале она должна печатать 0. Также приложение работает абсолютно нормально.

Теперь рассмотрим следующий код: (который похож на приведенный выше код для добавления одного заявления NSLog исключением: NSLog (@ "Bingoooooooo Memeory выхода");)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    UILabel *myLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(50, 200, 200, 80)]; 
    myLabel1.text = @"Prasad"; 
    NSLog(@"myLabel retain Count: %d\n", [myLabel1 retainCount]); 
    [myLabel1 release]; 
    NSLog(@"Bingoooooooo Memeory Released"); 
    NSLog(@"myLabel retain Count: %d\n", [myLabel1 retainCount]); 
    [window makeKeyAndVisible]; 
    return YES; 
} 

Теперь мой запрос,
1 Когда я запускаю вышеуказанный код, приложение распадается после печати NSLog (@ «Bingoooooooo Memeory Released»); Почему приложение разбивается, просто добавив инструкцию NSLog (@ «Bingoooooooo Memeory Released»), тогда как в первом коде приложение не разбивается.

+0

Prazi, пожалуйста, уделите время правильному форматированию кода в вашем вопросе, гораздо более вероятно, что кто-то сможет вам тогда помочь. –

+0

отправьте отчет о сбое приложения. – Tirth

+2

Если 'keepCount' когда-либо возвращал ноль, то особенность была бы достигнута, и вселенная закончилась бы. По крайней мере, это было бы для вашего приложения. – bbum

ответ

1

Документация -retainCount имеет следующее предупреждение:

Важно: Этот метод, как правило, не имеет значения в отладке проблем управления памятью. Поскольку любое количество объектов инфраструктуры может сохранить объект для хранения ссылок на него, в то время как пулы автозаполнения могут содержать любое количество отложенных релизов на объекте, очень маловероятно, что вы можете получить полезную информацию из этого метод.

И, как различные другие ответы о сохранить счетчик на переполнение стека говорят, не полагаться на -retainCount.


что, отвечая на ваши вопросы:

Q1. Когда я освобождаю mylabel1, инструкция NSLog в соответствии с инструкцией релиза все равно печатает saveCount как 1, тогда как в идеале она должна печатать 0.

Давайте рассмотрим, что ваш объект не находится в пуле автоопределений. Если объект имеет счетчик 1 и получает сообщение release, он будет освобожден. Какова цель уменьшения количества удержаний объекта освобождения? Среда выполнения не делает этого, потому что это бессмысленная операция, так как объект перестает существовать.

1. Когда я запускаю вышеуказанный код, приложение распадается после печати NSLog (@ «Bingoooooooo Memeory Released»); Почему приложение разбивается, просто добавив инструкцию NSLog (@ «Bingoooooooo Memeory Released»), тогда как в первом коде приложение не разбивается.

Прежде всего, обратите внимание, что поскольку myLabel1 не принадлежит другим объектам/Код, он освобождается при отправке [myLabel1 release]. Если вы отправляете дополнительные сообщения этому освобожденному объекту (например, [myLabel1 retainCount]), ваш код потенциально может быть поврежден, поэтому не делайте этого.

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

4

Прежде всего, никогда не смотрите на saveCount. Он не является надежным и зависит от множества внутренних факторов. Вторая версия вашего кода вызывает сбои, потому что: 1) Вы создаете ярлык, чтобы его счетчик хранения составлял 1 . 2) Вы освобождаете его, поэтому его количество удержания 0 3) Вы отправляете ему сообщение. Поскольку счетчик сохранения равен 0, он уже освобожден, поэтому приложение сработает.

Понятия не имею, почему первый вариант не врезаться

+0

@Prazi См. Ответ Дейва Делонга http://stackoverflow.com/questions/4636146/when-to-use-retaincount/4636477#4636477 – Robin