Obj-C, используя @selector для статического метода из статического метода в том же классе? - PullRequest
4 голосов
/ 20 февраля 2011

У меня есть два статических метода / селектора в одном классе, один передает другой в качестве обратного вызова внешнему методу. Однако, как я это закодировал, я получаю ошибку. Это работало, когда оба метода были методами экземпляра, и я читал, что это может работать, когда первый метод является методом экземпляра, использующим [self class]. Тем не менее, я не нашел информацию, когда оба статичны, и у меня не получилось, что она работает.

+(void)Validate {
    Callback *managerCallback = [[[Callback alloc] initWithTarget:self Action:@selector(Parse:)] autorelease];
    ...
}

+(void)Parse:(Callback *)managerCallback {
    ...
}

Спасибо! * * 1004

Ответы [ 2 ]

4 голосов
/ 20 февраля 2011

Callback * managerCallback = [[[Callback alloc] initWithTarget: self Action: @selector (Parse :)] autorelease];

Эта строка кода настроена для вызова метода экземпляра Parse:, а не метод класса, как вы его определили.

Objective-C не имеет статических методов.Он имеет методы класса и методы экземпляра.

Кроме того, ваши методы должны начинаться со строчных букв.

Herp-da-derp.Дэйв прав.

Учитывая это:

+(void)Validate {
    Callback *managerCallback = [[[Callback alloc] initWithTarget:self Action:@selector(Parse:)] autorelease];
    ...
}

+(void)Parse:(Callback *)managerCallback {
    ...
}

Некоторые комментарии:

  • методы должны начинаться со строчных букв

  • крайне странно использовать класс в такой роли;даже если вам действительно нужен только один из них, используйте экземпляр.По крайней мере, экземпляр - это удобная корзина для добавления состояния, и он в будущем значительно упростит рефакторинг, если вам когда-нибудь понадобится два.

  • Приведенный выше пример предполагает (и я предположил), что экземпляр Callback сохраняется.Для обратных вызовов, таймеров и некоторых других шаблонов это типично;сохранить цель, пока цель не будет вызвана в последний раз.Затем отпустите (или авто-релиз).Однако центры уведомлений этого не делают.Как правило, делегаты не сохраняются.

1 голос
/ 20 февраля 2011

Оказывается, что код написан правильно, чтобы делать то, что я хотел, но, поскольку для обратного вызова было установлено автоматическое высвобождение, объект освобождается до обработки обратного вызова.

...