【问题标题】:Where would I place a global utility function in Objective C?在 Objective C 中,我应该在哪里放置一个全局效用函数?
【发布时间】:2012-12-14 06:16:28
【问题描述】:

在编写 iOS 应用程序时,我应该在哪里放置我打算从任何其他文件中使用的函数?

例如,将 NSDate 转换为相对时间字符串(“5 secs ago”)的函数。 我会创建一个类并将这些函数全部设为静态吗?

【问题讨论】:

  • 在 Objective-C 的说法中,你不会将“函数”放在一个类中并使它们成为“静态”。相反,您将“类方法”添加到类中。您的问题含糊不清,因为还有静态函数(一个不相关的 C 概念)。
  • @NikolaiRuhe,Objective C 是建立在 C 之上的——如果根据具体情况创建一个 C 函数是最好的,那么创建一个 C 函数没有任何问题。虽然,我同意一般来说更经常为 iOS 开发创建一个类方法。
  • @JRG-Developer 我的印象是 Ryan 谈论的是类方法的概念,而不是静态 C 函数。他只是使用了其他语言中常见的术语,而不是 objc。
  • @NikolaiRuhe 没有人阻止您将所有应用程序代码放入普通的旧 C 程序中 - 不过我想我们在这里讨论的是样式和最佳实践。

标签: objective-c ios xcode cocoa


【解决方案1】:

函数可以放在方便的地方。如果一个函数或一组函数可能在很多地方被导入,您可以在它们自己的 .h/.m 对中声明和实现它们。例如,您可以在名为 XYZDateUtilities.m 的文件中实现日期转换函数,并在 XYZDateUtilities.h 中声明它。

使用static 限定符声明函数会将它们的范围限制在声明它们的文件中,所以你不想这样做;事实上,您可能想做相反的事情——在 .h 文件中将它们声明为 extern,以便它们在其他文件中可见。

【讨论】:

    【解决方案2】:

    你有几个选择:

    1) 如果您正在扩展一个类的行为(例如您描述的 NSDate 字符串转换方法),最好在该类上简单地创建一个类别。

    这是一个关于 iOS 类别的教程:

    http://mobile.tutsplus.com/tutorials/iphone/objective-c-categories/

    重要提示:

    类别会在项目中的任何地方更改类的行为(如果您重写方法)无论您是否在另一个特定类的导入中包含头 (.h) 文件

    因此,通常最好不要通过类别覆盖方法,而是创建一个子类来更改某些方法。

    然而,对于添加新方法,类别可能非常方便和有用。

    2) 如果您想创建一个在任何地方都可以导入的新类,您可以创建该类并将其头文件导入,即#import "MyClass.h",放入您项目的prefix.pch 文件(位于“支持文件”组下默认项目)。

    您放入prefix.pch 文件的任何内容都将在您的应用中的任何位置可用。这也是放置常量(例如字符串)或定义在应用程序内的许多类中使用的枚举的有用位置。

    我希望这会有所帮助。如果需要进一步澄清,请告诉我,我会尽力提供帮助。

    干杯!

    【讨论】:

    • 我认为问题是关于在哪里放置 函数 而不是方法。
    • 根据他的例子,我更可能使用类方法......虽然,你是对的,作者确实提到了创建 C 函数。
    • +1 用于建议类别。 NSDate 上的实例方法(不是类方法)将是处理这个特定示例的完美方式。
    • @noa,你说得对,我的意思是根据提问者的例子在一个类别上的实例方法(不是类方法)......;)
    【解决方案3】:

    另一种选择是为您的辅助方法创建一个类,并将所有辅助方法实现为类方法。

    例如HelperClass.h

    + (NSString *)getFrenchCapital
    

    例如HelperClass.m

    + (NSString *)getFrenchCapital
    {
        return @"Paris";
    }
    

    然后在你需要的地方导入你的帮助类,并简单地调用类方法:

    例如Foo.m

    #import "HelperClass.h"
    
    ...
    
    - (void)logFrenchCapital
    {
        NSLog(@"Capital of France: %@", [HelperClass getFrenchCapital]);
    } 
    

    【讨论】:

      【解决方案4】:

      如果您在一个类中将所有函数设为静态,那么替代方法是在 .m 文件中定义函数,在 .h 文件中定义外部函数,就像在 C 中所做的那样。

      【讨论】:

        猜你喜欢
        • 2011-03-30
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 2015-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多