我应该使用C函数还是Obj-C方法?

时间:2010-05-01 15:18:20

标签: iphone objective-c cocoa

我即将创建一个将两个NSDateComponent添加到一起的函数将这个函数放入C样式函数还是应该用于Obj-C方法?

是否有理由使用一个而不是另一个或者我应该始终坚持使用Obj-C?

BTW:并不是说它确实有所不同,但这适用于iPhone上的应用程序

非常感谢

4 个答案:

答案 0 :(得分:8)

在Objective-C中,正确的术语不是“在对象上调用方法”,而是“向对象发送消息”。

这使决策变得简单:您是否向对象发送消息?你是在告诉它做某事还是要求它提供信息?如果是,则通过将代码放入方法中使对象响应该消息。如果不是(如果任务独立于任何对象),则将其设为函数。

您可以浏览Foundation functionsUIKit functionsAppKit functions列表,以获取使某些内容属于函数而非方法的对象独立性的示例。

  

我即将创建一个将NSDateComponents添加到一起的函数将这个函数放入C样式函数还是应该用于Obj-C方法?

我会把它放到一个分类到NSDateComponents上的实例方法中。呼叫(消息)看起来像[componentsA componentsByAddingComponents_PRH:componentsB]。 (请注意,我添加了我的首字母缩写,以便如果Apple自己添加了componentsByAddingComponents:方法,当用户将其设备升级到新操作系统时,我的应用程序的行为不会突然改变。)

现有的一个例子是NSDecimalNumber's decimalNumberByAdding: method

答案 1 :(得分:3)

函数调用的开销略低于Objective C方法调用,但这并不是使用它们的好理由,除非您已经在该区域内检测到关键性能问题。

目标C程序与普通C程序有很大不同。保持语言的外观和惯用语的一致性是将几乎所有简单行为实现为方法而不是C函数的充分理由。

看看Cocoa-Touch使用函数的位置而不是方法的示例。

答案 2 :(得分:2)

您更有可能希望使用在NSDateComponents上作为类别实现的Objective-C方法。

@interface NSDateComponents (DGCalculations)
/*!
 \brief    Add date components
 \details  Add the given date components to the receiver and
           return the result as a new date components object.
*/
- (NSDateComponents *)componentsByAddingComponents:(NSDateComponents *)components;
@end

@implementation NSDateComponents (DGCalculations)
- (NSDateComponents *)componentsByAddingComponents:(NSDateComponents *)components {
    NSDateComponents *result = [[[NSDateComponents alloc] init] autorelease];
    [result setDay:[self day] + [components day]];
    // handle the rest
    return result;
}
@end

然后使用变得更好一点:

result = [firstComponents add:secondComponents];

答案 3 :(得分:0)

我不清楚“将NSDateComponents添加到一起”是什么意思。你能准确解释一下你需要做什么吗?

是否将其作为一种功能或方法在很大程度上取决于您希望如何使用它。是否有某些特定对象需要执行此操作,或者是否需要在程序中的许多位置显示?