使用匿名类别的类别中的私有方法

时间:2011-06-25 15:10:32

标签: objective-c cocoa private-methods objective-c-category

我正在创建一个超过NSDate的类别。它有一些实用方法,不应该是公共接口的一部分。

如何将它们设为私有?

在类中创建私有方法时,我倾向于使用“匿名类别”技巧:

@interface Foo()
@property(readwrite, copy) NSString *bar;
- (void) superSecretInternalSaucing;
@end

@implementation Foo
@synthesize bar;
.... must implement the two methods or compiler will warn ....
@end

但它似乎不适用于另一个类别:

@interface NSDate_Comparing() // This won't work at all
@end

@implementation NSDate (NSDate_Comparing)

@end

在类别中使用私有方法的最佳方法是什么?

4 个答案:

答案 0 :(得分:4)

应该是这样的:

@interface NSDate ()

@end

@implementation NSDate (NSDate_Comparing)

@end

答案 1 :(得分:2)

应该是

@interface NSDate (NSDate_Comparing)

@implementation一样。是否将@interface放在自己的.h文件中取决于您,但大多数时候您都希望这样做 - 因为您希望在其他几个类/文件中重用该类别。

确保为自己的方法添加前缀,以免干扰现有方法。或者可能的未来改进。

答案 2 :(得分:2)

我认为最好的方法是在.m文件中创建另一个类别。示例如下:

APIClient + SignupInit.h

@interface APIClient (SignupInit)

- (void)methodIAddedAsACategory;
@end

然后在APIClient + SignupInit.m

@interface APIClient (SignupInit_Internal)
- (NSMutableURLRequest*)createRequestForMyMethod;
@end

@implementation APIClient (SignupInit)

- (void)methodIAddedAsACategory
{
    //category method impl goes here
}
@end

@implementation APIClient (SignupInit_Internal)
- (NSMutableURLRequest*)createRequestForMyMethod
{
    //private/helper method impl goes here
}

@end

答案 3 :(得分:-1)

为了避免其他提议的解决方案出现的警告,您可以定义函数但不要声明它:

@interface NSSomeClass (someCategory) 
- (someType)someFunction;
@end

@implementation NSSomeClass (someCategory)

- (someType)someFunction
{
    return something + [self privateFunction];
}

#pragma mark Private

- (someType)privateFunction
{
    return someValue;
}

@end