我刚开始编写Objective-C,有Java背景,不知道人们写Objective-C程序是如何处理私有方法的。
我知道可能会有一些约定和习惯,把这个问题看作是人们在Objective-C中处理私有方法时使用的最佳技术的集合。
请包括一个论点,你的方法张贴时。为什么它是好的?你知道它有哪些缺点,你是如何处理它们的?
至于我目前的发现。
可以使用MyClass中定义的类别[例如MyClass (Private)]。M文件对私有方法进行分组。
这种方法有两个问题:
Xcode(和编译器?)不会检查你是否在相应的@implementation块中定义了私有类别中的所有方法
你必须把@interface放在MyClass的开头声明你的私有类别。m文件,否则Xcode抱怨一个消息像“self可能不响应消息“privateFoo”。
第一个问题可以用空类别来解决[例如MyClass()]。
第二个问题让我很困扰。我希望在文件末尾看到私有方法的实现(和定义);我不知道这是否可能。
Objective C中的每个对象都遵循NSObject协议,该协议保留了performSelector:方法。我以前也在寻找一种方法来创建一些“辅助或私有”方法,我不需要在公共级别上公开这些方法。如果你想创建一个没有开销的私有方法,并且不需要在头文件中定义它,那么就试试这个…
用与下面代码相似的签名定义your方法…
-(void)myHelperMethod: (id) sender{
// code here...
}
然后,当你需要引用该方法时,只需将其作为选择器调用…
[self performSelector:@selector(myHelperMethod:)];
这行代码将调用您创建的方法,并且不会出现关于头文件中没有定义该方法的恼人警告。
Objective C中的每个对象都遵循NSObject协议,该协议保留了performSelector:方法。我以前也在寻找一种方法来创建一些“辅助或私有”方法,我不需要在公共级别上公开这些方法。如果你想创建一个没有开销的私有方法,并且不需要在头文件中定义它,那么就试试这个…
用与下面代码相似的签名定义your方法…
-(void)myHelperMethod: (id) sender{
// code here...
}
然后,当你需要引用该方法时,只需将其作为选择器调用…
[self performSelector:@selector(myHelperMethod:)];
这行代码将调用您创建的方法,并且不会出现关于头文件中没有定义该方法的恼人警告。
其他人已经说过,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
我认为这种方法最大的优点是,它允许您根据功能对方法实现进行分组,而不是根据(有时是任意的)公共/私有区分进行分组。