2010-09-09 4 views
0

У меня есть этот код:Могу ли я игнорировать это предупреждение iphone?

if([annotation respondsToSelector:@selector(tag)]){ 
    disclosureButton.tag = [annotation tag]; 
} 

и я получаю предупреждение:

'-tag' не найден в протоколе

Справедливо, но я создал новый объект с протоколом, который имеет синтезированную переменную int tag.

EDIT: найдено, почему приложение терпит крах - не эта строка. Теперь я просто получаю предупреждение, и приложение работает нормально.

Благодаря Том

+0

Вы пробовали включения NSZombieEnabled? – willcodejavaforfood

+0

Вы не думаете, что эта линия? Что отладчик должен сказать об этом? –

+0

EXC_BAD_ACCESS - это была переменная, которую я не сохранил ... так что не эта строка вообще. Эта строка просто дает мне предупреждение. Посмотрите на NSZombieEnabled ... не уверен, что он делает. :) спасибо –

ответ

4

Предупреждение генерируется, потому что для статического типа из annotation, MKAnnotation, нет никакого способа -tag. Как вы уже отметили, динамический тип отвечает на селектор, вы можете игнорировать предупреждение в этом случае.

Чтобы избавиться от предупреждения:

  • Если вы ожидаете определенный класс, который вы можете проверить это вместо:

    if ([annotation isKindOfClass:[TCPlaceMark class]]) { 
        disclosureButton.tag = [(TCPlaceMark *)annotation tag]; 
    } 
    
  • Для протокола:

    if ([annotation conformsToProtocol:@protocol(PlaceProtocol)]) { 
        disclosureButton.tag = [(id<PlaceProtocol>)annotation tag]; 
    } 
    
  • Или если оба они не применяют, используйте специальный протокол для подавления предупреждения (полезно, например, с помощью ra pidly изменения Apple, API):

    @protocol TaggedProtocol 
    - (int)tag; 
    @end 
    
    // ... 
    if([annotation respondsToSelector:@selector(tag)]){ 
        disclosureButton.tag = [(id<TaggedProtocol>)annotation tag]; 
    } 
    
+0

это потрясающе! :) Спасибо –

Смежные вопросы