我想知道为什么在Books和Apple Documentation中有时一个方法将冒号作为后缀,但有时不是。我想这意味着如果它没有冒号,它就没有参数。另一方面,如果它有一个冒号,它只有一个参数。是对还是错?
答案 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:);
使选择器的签名错误将导致在调试时深夜刮伤。