【问题标题】:Should i use a C function or Obj-C Method?我应该使用 C 函数还是 Obj-C 方法?
【发布时间】:2010-05-01 15:18:20
【问题描述】:

我即将创建一个将两个 NSDateComponents 加在一起的函数,将其放入 C 样式函数中是否有任何优势,还是应该放入 Obj-C 方法中?

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

顺便说一句:我敢肯定这并没有什么不同,但这是针对 iPhone 上的应用程序

非常感谢

【问题讨论】:

  • 您的意思是“添加两个 NSDateComponents”还是“向 NSDateComponents 类添加新功能”?
  • 道歉我的意思是“添加两个 NSDateComponet”。已对帖子进行编辑以更正此问题。

标签: iphone objective-c cocoa


【解决方案1】:

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

这使决定变得容易:您是否正在向对象发送消息?您是在告诉它做某事还是向它询问信息?如果是这样,则通过将代码放入方法中使对象响应该消息。如果不是(如果任务独立于任何对象),则使其成为函数。

您可以浏览Foundation functionsUIKit functionsAppKit functions 列表,以了解使某物属于函数而非方法的对象独立性示例。

我即将创建一个添加到 NSDateComponents 的函数,将其放入 C 样式函数中是否有任何优势,还是应该放入 Obj-C 方法中?

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

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

【讨论】:

  • +1 表示“发送消息到”(非常重要的区别!)以及并非所有事情都必须作为一种方法最好地完成(至少在单一的调度语言中)。跨度>
【解决方案2】:

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

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

看看 Cocoa-Touch 在哪里使用函数而不是方法作为这种方法的示例。

【讨论】:

    【解决方案3】:

    您更有可能希望使用作为 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];
    

    【讨论】:

      【解决方案4】:

      我不清楚您所说的“一起添加到 NSDateComponents”是什么意思。你能具体解释一下你需要做什么吗?

      将其设为函数还是方法很大程度上取决于您希望如何使用它。是否有某些特定对象需要执行此操作,或者该需求可能会出现在您程序的许多地方?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-09
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-05
        相关资源
        最近更新 更多