我有时会在Books“layoutSubviews Method”中读到有时读“drawRect:Method”的原因吗?

时间:2009-04-13 12:37:29

标签: objective-c

我想知道为什么在Books和Apple Documentation中有时一个方法将冒号作为后缀,但有时不是。我想这意味着如果它没有冒号,它就没有参数。另一方面,如果它有一个冒号,它只有一个参数。是对还是错?

3 个答案:

答案 0 :(得分:1)

这是正确的,虽然这是一个简单的拼写错误。您应该始终检查文档以确保任何方法的签名,以避免任何运行时错误。

带签名的方法:

- (void)refresh

将像:

一样使用
[myObject refresh];

带签名的方法:

- (void)refreshView:(UIView *)view

将像:

一样使用
[myObject refreshView:view];

最后,一个带签名的方法:

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

将像:

一样使用
[myObject refreshView:view updateLabels:YES];

答案 1 :(得分:1)

你是正确的,尾随冒号表示单个参数,并且在代码中使用完整的包含冒号的名称很重要 - 例如@selector(drawRect:)

然而,虽然我无法在散文中找到一个例子,但我相信你偶尔会看到没有尾随冒号的方法,只是为了让它更好读。我知道我在撰写评论/文档时这样做 - 例如当我实际上是指doFoo:时,“子类应该自定义doFoo方法”。因此,如果您在散文中看到方法名称,那么在头文件或类引用文档中检查正确的签名可能是个好主意。

答案 2 :(得分:0)

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:);

使选择器的签名错误将导致在调试时深夜刮伤。