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

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

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


至于我目前的发现。

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

这种方法有两个问题:

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

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


当前回答

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

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

@implementation MyClass 
// .. public methods

# pragma mark private 
// ...

@end

其他回答

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

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

@implementation MyClass 
// .. public methods

# pragma mark private 
// ...

@end

如果你想避免顶部的@interface块,你可以总是把私有声明放在另一个文件myclasprivate .h中,这并不理想,但它不会使实现混乱。

MyClass.h

interface MyClass : NSObject {
 @private
  BOOL publicIvar_;
  BOOL privateIvar_;
}

@property (nonatomic, assign) BOOL publicIvar;
//any other public methods. etc
@end

MyClassPrivate.h

@interface MyClass ()

@property (nonatomic, assign) BOOL privateIvar;
//any other private methods etc.
@end

MyClass.m

#import "MyClass.h"
#import "MyClassPrivate.h"
@implementation MyClass

@synthesize privateIvar = privateIvar_;
@synthesize publicIvar = publicIvar_;

@end

其他人已经说过,Objective-C中没有私有方法。然而,从Objective-C 2.0(意味着Mac OS X Leopard, iPhone OS 2.0和更高版本)开始,你可以创建一个名为类扩展的空名称(即@interface MyClass())的类别。类扩展的独特之处在于方法实现必须与公共方法放在同一个@implementation MyClass中。所以我的课程结构是这样的:

在.h文件中:

@interface MyClass {
    // My Instance Variables
}

- (void)myPublicMethod;

@end

在.m文件中:

@interface MyClass()

- (void)myPrivateMethod;

@end

@implementation MyClass

- (void)myPublicMethod {
    // Implementation goes here
}

- (void)myPrivateMethod {
    // Implementation goes here
}

@end

我认为这种方法最大的优点是,它允许您根据功能对方法实现进行分组,而不是根据(有时是任意的)公共/私有区分进行分组。

没有私有方法是有好处的。您可以将打算隐藏的逻辑移动到单独的类中,并将其用作委托。在这种情况下,您可以将委托对象标记为私有,从外部将不可见。将逻辑移动到单独的类(可能是几个)可以更好地设计项目。因为你的类变得更简单,你的方法被分组在具有正确名称的类中。

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