Есть ли причина, по которой я иногда читаю в Книгах «Метод layoutSubviews», а иногда «drawRect: Метод»? - PullRequest
1 голос
/ 13 апреля 2009

Мне интересно, почему в Книге и Документации Apple иногда у метода есть это двоеточие в качестве суффикса, а иногда нет. Я думаю, это означает, что если у него нет двоеточия, у него нет параметра. С другой стороны, если у него есть двоеточие, у него ровно один параметр. Правильно или нет?

Ответы [ 3 ]

1 голос
/ 13 апреля 2009

Вы правы, что завершающий двоеточие означает один параметр, и важно использовать полное имя, включая двоеточие, в коде - например, @selector(drawRect:)

Однако, хотя я не могу найти пример из рук в прозе, я полагаю, что вы иногда будете видеть методы, написанные без конечного двоеточия, просто чтобы сделать его лучше читаемым. Я знаю, что делаю это при написании комментариев / документации - например, «Подклассы должны настраивать метод doFoo», когда я на самом деле имею в виду doFoo:. Так что, если вы видите имена методов в прозе, возможно, стоит проверить правильность подписи в заголовочном файле или справочной документации по классам.

1 голос
/ 13 апреля 2009

Это правильно, хотя это легко опечатка. Вы должны всегда проверять документацию, чтобы убедиться, что подпись любого метода позволяет избежать ошибок во время выполнения.

Метод с подписью:

- (void)refresh

Будет использоваться как:

[myObject refresh];

Метод с подписью:

- (void)refreshView:(UIView *)view

Будет использоваться как:

[myObject refreshView:view];

И, наконец, метод с подписью:

- (void)refreshView:(UIView *)view updateLabels:(BOOL)update

Будет использоваться как:

[myObject refreshView:view updateLabels:YES];
0 голосов
/ 13 апреля 2009

Objective-C refreshView: и refreshView - два разных метода. Первый принимает один параметр, другой - без параметров. Как вы говорите.

Это важно, потому что это полное имя метода, и вы должны иметь возможность написать это правильно при передаче селекторов.

Например, при показе листа:

- (void)beginSheet:(NSWindow *)sheet 
    modalForWindow:(NSWindow *)docWindow 
    modalDelegate:(id)modalDelegate 
    didEndSelector:(SEL)didEndSelector 
    contextInfo:(void *)contextInfo;

didEndSelector обычно имеет вид:

- (void)sheetDidEnd:(NSWindow *)sheet 
    returnCode:(int)returnCode 
    contextInfo:(void *)contextInfo;

и поэтому в методе beginSheet его необходимо будет передать параметру didEndSelector следующим образом:

@selector(sheetDidEnd:returnCode:contextInfo:);

Неправильная подпись селектора приведет к тому, что во время отладки будет возникать большая ночная царапина на голове.

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