Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Private methods in a Category, using an anonymous category

I'm creating a category over NSDate. It has some utility methods, that shouldn't be part of the public interface.

How can I make them private?

I tend to use the "anonymous category" trick when creating private methods in a class:

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

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

but it doesn't seem to work inside another Category:

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

@implementation NSDate (NSDate_Comparing)

@end

What's the best way to have private methods in a Category?

like image 342
cfischer Avatar asked Jun 25 '11 15:06

cfischer


3 Answers

It should be like this:

@interface NSDate ()

@end

@implementation NSDate (NSDate_Comparing)

@end
like image 83
Paul Semionov Avatar answered Nov 18 '22 04:11

Paul Semionov


It should be

@interface NSDate (NSDate_Comparing)

as in the @implementation. Whether or not you put the @interface in its own .h file is up to you, but most of the time you'd like to do this - as you want to reuse that category in several other classes/files.

Make sure to prefix your own methods to not interfere with existing method. or possible future enhancements.

like image 37
Eiko Avatar answered Nov 18 '22 03:11

Eiko


I think the best way is to make another category in .m file. Example below:

APIClient+SignupInit.h

@interface APIClient (SignupInit)

- (void)methodIAddedAsACategory;
@end

and then in 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
like image 2
Michał Zygar Avatar answered Nov 18 '22 03:11

Michał Zygar