Отправка сообщений на объекты? - PullRequest
0 голосов
/ 13 апреля 2011

Я делал это успешно много раз, но на этот раз это просто не сработает.

Код в моем .h файле:

@interface Images : NSView {

}

- (void) draw;

@end

Файл .m (другого объекта):

- (IBAction) go: (id) sender; {
[Images draw:nil];

}

Когда я пытаюсь скомпилировать это, он говорит следующее:

'*' may not respond to '*

Images may not respond to '+draw'

Это меня совсем запутало. Разве это не должно работать?

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

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011

Ваш draw метод является методом экземпляра: его можно вызывать только для экземпляров класса Images. В вашем go: методе вы пытаетесь вызвать его как метод класса - если это то, что вам нужно, измените его на:

@interface Images : NSView
+ (void)draw;
@end
1 голос
/ 13 апреля 2011

Я думаю, что обзор некоторых основных концепций объектно-ориентированного программирования в порядке;а именно различие между классом и объектом или экземпляром.

Класс в общем смысле представляет собой набор данных и функций, которые на него воздействуют.Класс определяет интерфейс, который используется для доступа и манипулирования данными, которые логически сгруппированы вместе, и служит образцом для создания объектов или экземпляров.См. http://en.wikipedia.org/wiki/Class_(computer_programming)

Экземпляры класса (объекты) - это типичные вещи, которыми вы манипулируете в объектно-ориентированной программе, и они создаются из класса "blueprint" и следуют поведению, заданному классом.

Типичный пример - фрукты, например, яблоки.Воображаемый класс Apple будет представлять все яблоки в общем смысле и будет моделировать такие свойства, как цвет и размер, а также такие действия, как мыть и есть.Экземпляр мог бы представлять одно физическое яблоко - Бабуля Смит или Пиппин или что-то еще.

Так же, как нет смысла мыть или есть яблоки в общем смысле этого слова (концепция яблок).а не агломерация), как правило, не имеет смысла говорить классу, что делать.Вы говорите объектам (отдельным яблокам), что делать.

Код, представленный выше, определяет класс Images.Знак "-" перед - (void) указывает, что метод рисования существует только для определенных объектов.Это типовой метод на обычном языке OO.

Конечно, в Obj-C также можно отправлять сообщения классу, не требуя объекта.Это обозначается знаком «+» перед именем метода, как указывают другие ответы.Это называется статическим методом и обычно используется для управления некоторым общим поведением или аспектом всех объектов этого конкретного класса.

Проблема с вашим кодом заключается в том, что вы объявляете - (void) draw как метод экземплярано вызывая его как статический метод.Какой способ вы хотите сделать, зависит от вас, и по вашему коду сложно определить, для чего предназначен класс Images.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...