我是Objective C的新手。
它说:
在所有参数之前使用关键字。 正确的方法:
- (void)sendAction:(SEL)aSelector toObject:(id)anObject forAllCells:(BOOL)flag;
错误的方式:
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;
让我对Objective-C的方法名称感到困惑。这是我的问题:
1
不推荐错误的方法。但这完全合法,对吗?
2
方法的名称(签名?)是 sendAction:toObject:forAllCells:表示第一个, sendAction ::: 表示第二个。对? 我注意到人们强调冒号:总是计算在方法名称中。 我假设:表示将跟随一个参数,无论如何都不能修改它。那么在方法名称中包含冒号的含义是什么,因为它不受我的修改。
3
举一个例子, - (void)sendAction:(SEL)aSelector;
所以方法的名称应该是sendAction:
注意冒号之前的空格是名称的一部分,我应该将其视为与 - (void)sendAction:(SEL)aSelector; 不同的方法吗?
答案应为NO [anObject sendAction:anSel];应该与[anObject sendAction:anSel];
相同你们如何理解这个有意义的整体方案? 谢谢。
P.S。通过这个问题欣赏你的阅读。我很确定一旦你们中的一些人指出并清除了我的困惑,我会感到愚蠢。
答案 0 :(得分:1)
错误的方式是合法的,是的,但风格不好。不要这样做。冒号是使ObjC代码很好阅读的一部分(虽然详细);呼叫站点上的所有参数都有标签,提醒您它们的用途以及它们应该是什么类型。
该空间实际上不是方法名称的一部分;它被忽略了。关于ObjC的其中一个问题就是"compiler-specified"。
@interface Jackson : NSObject
- (void)shootCannon :(double)range;
- (void)grillSandwichWithBread :(BreadType)bread cheese :(CheeseType)cheese;
@end
@implementation Jackson
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSLog(@"%@", NSStringFromSelector(@selector(shootCannon:)));
NSLog(@"%@", NSStringFromSelector(@selector(shootCannon :)));
NSLog(@"%@", NSStringFromSelector(@selector(grillSandwichWithBread:cheese:)));
NSLog(@"%@", NSStringFromSelector(@selector(grillSandwichWithBread :cheese :)));
NSLog(@"%d", @selector(shootCannon:) == @selector(shootCannon :));
NSLog(@"%d", @selector(grillSandwichWithBread:cheese:) == @selector(grillSandwichWithBread :cheese :));
}
return 0;
}
2014-04-05 23:59:29.548 MethodNameSpace [66948:303] shootCannon:
2014-04-05 23:59:29.548 MethodNameSpace [66948:303] shootCannon:
2014-04-05 23:59:29.549 MethodNameSpace [66948:303] grillSandwichWithBread:cheese:
2014-04-05 23:59:29.550 MethodNameSpace [66948:303] grillSandwichWithBread:cheese:
2014-04-05 23:59:29.550 MethodNameSpace [66948:303] 1
2014-04-05 23:59:29.551 MethodNameSpace [66948:303] 1