Использование [self method] или @selector (method)?

Может ли кто-нибудь просветить меня относительно различий между этими двумя утверждениями ниже.

[self playButtonSound];

и

[self performSelector:@selector(playButtonSound)];

Я просто спрашиваю, как у меня был старый код, который использовал @selector, теперь с небольшим количеством знаний, я не могу думать, почему я не использовал [self playButtonSound] вместо этого, они оба, похоже, делают то же самое, что и здесь.

Гэри

Ответ 1

И то же самое, но [self playButtonSound];, безусловно, является обычным способом вызова метода в Objective-C. Однако использование performSelector: позволяет вызывать метод, который определяется только во время выполнения.

Из Ссылка на протокол NSObject:

Метод performSelector: эквивалентно отправке aSelectorсообщение непосредственно получателю. Для Например, все три из следующих сообщения делают то же самое:

id myClone = [anObject copy];
id myClone = [anObject performSelector:@selector(copy)];
id myClone = [anObject performSelector:sel_getUid("copy")];

Однако метод performSelector:позволяет отправлять сообщения, которые arent определяется до времени выполнения. селектор переменной может быть передан как Аргумент:

SEL myMethod = findTheAppropriateSelectorForTheCurrentSituation();
[anObject performSelector:myMethod];

Ответ 2

[self playButtonSound]; 

Здесь компилятор проверяет, реагирует ли ваш объект на сообщение -playButtonSound и выдаст вам предупреждение, если это не так.

[self performSelector:@selector(playButtonSound)];

Вызов -playButtonSound таким образом вы не получите предупреждения компилятора. Однако вы можете динамически проверять, реагируют ли объекты на определенный селектор, поэтому вы можете безопасно попытаться вызвать произвольный селектор объекта без указания его типа и не получать предупреждения о компиляторе (что может быть полезно, например, для вызова дополнительных методов в делетете объектов)

if ([self respondsToSelector:@selector(playButtonSound)])
  [self performSelector:@selector(playButtonSound)];