Почему «неизвестный метод для селектора x» является серьезной ошибкой в ​​ARC? - PullRequest
4 голосов
/ 12 февраля 2012

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

Однако, почему эта ошибка специфична для ARC?ARC решает, что ему нужно для сохранения / освобождения / автоматического выпуска, на основе соглашений об управлении памятью какао, которые предполагают, что достаточно знать имя селектора.Поэтому имеет смысл, что существуют проблемы с передачей переменной SEL в performSelector:, поскольку во время компиляции неизвестно, является ли селектор методом init / copy / new или нет.Но почему видение этого в интерфейсе класса не имеет никакого значения?

Я что-то упускаю из-за того, как работает ARC, или предупреждения о лязге просто немного противоречивы?

Ответы [ 2 ]

9 голосов
/ 12 февраля 2012

ARC решает, что ему нужно для сохранения / освобождения / автоматического выпуска, на основе соглашений об управлении памятью какао, которые предполагают, что достаточно знать имя селектора.что ARC определяет управление памятью.ARC также может определять управление памятью через атрибуты.Например, вы можете объявить любой сохраняемый typedef, используя __attribute__((NSObject)) (никогда, никогда не делайте этого, но это допустимо).Вы также можете использовать другие атрибуты, такие как __attribute((ns_returns_retained)) и некоторые другие, чтобы переопределить соглашения об именах (это то, что вы могли бы разумно сделать, если не могли исправить имя; но гораздо лучше исправить имя).Теперь представьте себе случай, когда вы не смогли включить заголовочный файл, который объявляет эти атрибуты в одних файлах, но не в других.Теперь некоторые модули компиляции (файлы .m) управляют этим одним способом, а некоторые - другим.Шутки гарантируют.Это намного, намного хуже, чем ситуация без ARC, и возникающие в результате ошибки были бы ошеломляющими, потому что какой-то код ARC мог бы делать одно, а другой код ARC делал бы что-то другое.тот.(Конечно, вы никогда не должны игнорировать предупреждения в Objective-C, но это особенно неприятная ситуация.)

1 голос
/ 12 февраля 2012

Я бы предположил, что это унция профилактики. Между прочим, в больших системах он не является надежным, потому что селекторы не должны совпадать, а совпадение основано на переводе , поэтому он может все же взорвать вас, если вы не пишете свою программу, так что он вводит тип безопасность. Но что-то лучше, чем ничего!

Компилятор хочет знать о параметрах и возвращаемых типах, потенциально аннотациях и выходных параметрах. У ObjC есть настройки по умолчанию, но это хороший источник множества типов ошибок, так как компилятор делает больше для вас.

Существует ряд причин, по которым вы должны ввести тип безопасности и увеличить уровни предупреждений. С ARC их становится еще больше. Независимо от того, действительно ли это необходимо, это хорошее направление для компилятора objc, чтобы двигаться в сторону (IMHO). В этом отношении вы можете считать C99 более безопасным, чем ObjC 2.0;)

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

...