以类C语法调用函数

时间:2014-02-21 20:54:50

标签: objective-c iphone syntax

如何在Xcode max中编写类似于Java或C ++语法的代码,特别是调用函数(消息),静态还是动态?我只想简单地用类C语法调用Objective-C函数。

如何写NSString * s = NSString.alloc().init(); (或类似的,例如,NSString::alloc().init(),或NSString::alloc.init(new NSString()).alloc().init() ;)) 在Xcode(或其他iPhone开发环境)中,编译器没有导致错误,它将运行。

或类似

的代码
NSString * a = NSString.alloc().init(); //or similar 

bool b = a.compare("abcdef"); //or bool b = a->compare("abcdef"); 

将会运行。

2 个答案:

答案 0 :(得分:4)

Objective-C有C函数。实际上,所有有效的C代码都是有效的Objective-C代码。所以是的,你可以使用C语法调用函数。

但是,对象和消息发送使用Objective-C对C的语法扩展,这是不可配置的。他们是语言的一部分。您不能更改Objective-C的语法,而不能使C ++使用Smalltalk语法。

答案 1 :(得分:0)

不,没有办法用不同的语法调用Objective-C方法,但有一个例外:

您可以调用不带点参数的参数的方法,如object.method中所示(这主要用于属性,而属性又是编译器生成的getter和setter方法)。

因此无法更改Objective-C([object method][object methodWithArgumentA:someValue argumentB:otherValue])中调用方法的方式。这是语言设计者选择的语法。一旦你使用了一点,你就会明白为什么:

Objective-C中的方法名称往往是非常具有描述性的,并且被用作Objective-C具有命名参数(从技术上讲,情况并非如此)。像:

[someData writeToFile:aFileName atomically:YES];

您如何将其转换为点符号?它可能看起来像这样:

someData.writeToFileAtomically(aFileName, YES);

现在,如果我看到一个方法只是writeToFileAtomically我会不会感到惊讶,如果它只需要一个参数(是否原子写入文件;但是哪个文件?)或没有参数(只是写入一个原子地文件;再次,哪个文件?)。使用Objective-C表示法,意图更清晰。

现在考虑object.addObserverForKeyPathOptionsContext(o, k, op, c)[object addObserver:o forKeypath:k options:op context:c]

是否喜欢这种语法是主观的。你似乎不喜欢它,因为你不会问如​​何摆脱它。但是如果你想编写Objective-C代码,你必须接受这就是它的完成方式而你无法改变它。拥抱它,我一开始也发现它很奇怪(也来自长篇C ++和Java背景)但是现在我想念在使用其他语言时用Objective-C的参数调用方法的非常冗长的方式。