我刚开始编写Objective-C,有Java背景,不知道人们写Objective-C程序是如何处理私有方法的。

我知道可能会有一些约定和习惯,把这个问题看作是人们在Objective-C中处理私有方法时使用的最佳技术的集合。

请包括一个论点,你的方法张贴时。为什么它是好的?你知道它有哪些缺点,你是如何处理它们的?


至于我目前的发现。

可以使用MyClass中定义的类别[例如MyClass (Private)]。M文件对私有方法进行分组。

这种方法有两个问题:

Xcode(和编译器?)不会检查你是否在相应的@implementation块中定义了私有类别中的所有方法 你必须把@interface放在MyClass的开头声明你的私有类别。m文件,否则Xcode抱怨一个消息像“self可能不响应消息“privateFoo”。

第一个问题可以用空类别来解决[例如MyClass()]。 第二个问题让我很困扰。我希望在文件末尾看到私有方法的实现(和定义);我不知道这是否可能。


当前回答

虽然我不是Objective-C专家,但我个人只是在我的类的实现中定义方法。当然,它必须在任何调用它的方法之前定义,但它肯定需要最少的工作。

其他回答

Objective C中的每个对象都遵循NSObject协议,该协议保留了performSelector:方法。我以前也在寻找一种方法来创建一些“辅助或私有”方法,我不需要在公共级别上公开这些方法。如果你想创建一个没有开销的私有方法,并且不需要在头文件中定义它,那么就试试这个…

用与下面代码相似的签名定义your方法…

-(void)myHelperMethod: (id) sender{
     // code here...
}

然后,当你需要引用该方法时,只需将其作为选择器调用…

[self performSelector:@selector(myHelperMethod:)];

这行代码将调用您创建的方法,并且不会出现关于头文件中没有定义该方法的恼人警告。

虽然我不是Objective-C专家,但我个人只是在我的类的实现中定义方法。当然,它必须在任何调用它的方法之前定义,但它肯定需要最少的工作。

没有办法绕过问题2。这就是C编译器(以及Objective-C编译器)的工作方式。如果你使用XCode编辑器,函数弹出会让你很容易浏览文件中的@interface和@implementation块。

正如其他人所说,在@implementation块中定义私有方法对于大多数目的来说是可以的。

关于代码组织的话题——我喜欢把它们放在pragma mark private下,以便在Xcode中更容易导航

@implementation MyClass 
// .. public methods

# pragma mark private 
// ...

@end

还有一件事我在这里没有看到提到——Xcode支持名称为“_private”的。h文件。假设你有一个类。m和myclass。h现在你还可以有myclass_private。h。Xcode会识别它,并将其包含在助理编辑器的“对应项”列表中。

//MyClass.m
#import "MyClass.h"
#import "MyClass_private.h"