Какова сделка с [[UIApplication sharedApplication] делегатом]? - PullRequest
4 голосов
/ 12 ноября 2010

Я использую [[UIApplication sharedApplication] делегат], чтобы разделить переменную между несколькими классами.Я устанавливаю значение в AppDelegate.Я могу NSLog это от myAppDelegate.m и увидеть значение.Затем я пытаюсь NSLog значение, когда одна из моих вкладок загружается, и она падает:

myAppDelegate *app = (myAppDelegate *)[[UIApplication sharedApplication] delegate];
NSLog(@"Value:%@ ", app.delegateVar); // <--- Causes Crash

В основном кажется, что это создает новый экземпляр app.delegateVar?

определен делегатВарв myAppDelegate.h, а затем в myAppDelegate.m я делаю это:

  - (void)applicationDidFinishLaunching:(UIApplication *)application {

        ...

        [delegateVar release];
        delegateVar = [NSString stringWithFormat:@"Test Value"];
        NSLog(@"%@",delegateVar);

    ...
    }

Ответы [ 2 ]

6 голосов
/ 12 ноября 2010

Одна возможность состоит в том, что delegateVar высвобождается преждевременно.

Например, возможно, свойство DelegateVar не настроено с опцией retain, вы явно вызываете [delegateVar release] или вы обходите установщик (и его сохраняющую семантику), присваивая ему напрямую (delegateVar = вместо self.delegateVar =).

В любом случае посмотрите на код, который создает, присваивает и освобождает DelegateVar.


Обновление:

Бинго. Это ваша проблема прямо здесь:

    [delegateVar release];
    delegateVar = [NSString stringWithFormat:@"Test Value"];
    NSLog(@"%@",delegateVar);

Вы присваиваете автоматически освобожденное значение (из + NSString stringWithFormat :) для DelegateVar и не предпринимаете никаких действий для его сохранения. Это означает, что как только applicationDidFinishLaunching: вернется, DelegateVar автоматически освобождается (и становится недействительным).

Если DelegateVar является свойством с определенной опцией «retain», вы должны сделать это следующим образом:

self.delegateVar = [NSString stringWithFormat:@"Test Value"];

Вам не нужно освобождать DelegateVar перед присвоением ему (используя self.delegateVar =), потому что установщик сбросит старое значение по мере необходимости. Но вам нужно нужно выпустить его по вашему dealloc методу.

2 голосов
/ 12 ноября 2010

Дэвид Гелхар, вероятно, нашел причину проблемы, однако, когда у вас есть проблемы с управлением памятью (EXC_BAD_ACCESS - признак проблем с управлением памятью), вы можете сделать несколько вещей:

  1. Перечитайте правила управления памятью Какао и убедитесь, что вы следуете им.
  2. Запустите статический анализатор .Это часто приводит к тому, что вы пренебрегали правилами управления памятью.
  3. Попробуйте использовать NSZombieEnabled, чтобы выяснить, отправляете ли вы сообщения нераспределенным экземплярам.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...