2015-10-30 1 views
1

У меня есть следующий код:performSelector причины утечки, потому что не правильный тип в Objective C

SEL moveAlongBoth = @selector(moveAlongX:andY:); 
if ([p1 respondsToSelector:moveAlongBoth]) { 
    [p1 performSelector: moveAlongBoth 
      withObject: [NSNumber numberWithInt:1] 
      withObject: [NSNumber numberWithInt:1]]; 
} 

Я получаю «performSelector может вызвать утечку» предупреждение. Но

[p1 moveAlongX:1 andY:1]; 

Работы просто отлично.

Я понимаю, что получаю сообщение об ошибке, потому что значения имеют значение (int) в реализации, и я использую NSNumber. Не изменяя реализацию, как бы я хотел объявить числовое значение int (если возможно)?

+0

Это ошибка или предупреждение? –

+0

Извините, предупреждение. Но результат неверен. –

+0

Хорошо, тогда посмотрите на результат. Это предупреждение, потому что ARC не может «видеть» выше performSelector. –

ответ

1

Почему вы не можете просто сделать это:

if ([p1 respondsToSelector:@selector(moveAlongX:andY:)]) { 
    [(id)p1 moveAlongX:1 andY:1]; 
} 

К слову, Cocoa naming convention бы вы вызываете этот метод moveAlongX:y:.

+0

Спасибо! Инструкции хотели, чтобы мы использовали responsesToSelector, и по какой-то причине я даже не думал, что так делаю! –

0

Что касается второй части. Если вы отвечаете за классы, которые могут быть типа p1, то вы можете определить с moveAlongBoth:: и вместо проверки с performSelector проверить wit conformsToProtocol. Скажем, имя протокола, который является CanMoveAlong, то вы можете привести его к

id <CanMoveAlong> canDo = (id<CanMoveAlong>)p1; 

после проверяется соответствие и непосредственно вызывать метод

[canDo moveAlongX:1 andY:1]; 

Doing так вы достигаете как вы избавиться от предупреждения и вы может пройти int непосредственно без использования NSNumber.

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

  • Нет связанных вопросов^_^