Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hiding properties from public framework headers, but leaving available internally

Tags:

objective-c

I need to have property in class that is excluded from public framework headers, but it is available for use internally in other framework classes. What I did right now is:

MyClass.h:

@interface MyClass: NSObject

@end

MyClass+Internal.h

@interface MyClass (Internal)
@property (nonatomic, copy) NSString *mySecretProperty;
@end

MyClass.m

#import "MyClass.h"
#import "MyClass+Internal.h"

@interface MyClass ()
@property (nonatomic, copy) NSString *mySecretProperty;
@end

@implementation MyClass
@end  

And I can use private property like:

MyOtherClass.m:

#import "MyClass.h"
#import "MyClass+Internal.h"

@implementation MyOtherClass
- (void)test {
    MyClass *myClass = [MyClass new];
    NSLog(@"%@", myClass.mySecretProperty)
}
@end 

But what I don't like about this setup is that I have duplicate declaration of property in my Internal Category and inside of anonymous Category. Is there a way to improve this setup?

like image 336
Mindaugas Avatar asked Dec 11 '22 11:12

Mindaugas


1 Answers

I think you could do with the class extension only, there is no need to use a category. The quick fix would be to remove the category name from the parenthesis, transforming it into the class extension, then remove the class extension declaration from the .m file. After this you only import the extension header in your framework classes and you make sure it is a private header of your framework.

MyClass.h

@interface MyClass: NSObject

@end

MyClass+Internal.h

#import "MyClass.h"

@interface MyClass ()
@property (nonatomic, copy) NSString *mySecretProperty;
@end

MyClass.m

#import "MyClass.h"
#import "MyClass+Internal.h"

@implementation MyClass
@end

MyOtherClass.m:

#import "MyClass.h"
#import "MyClass+Internal.h"

@implementation MyOtherClass
- (void)test {
    MyClass *myClass = [MyClass new];
    NSLog(@"%@", myClass.mySecretProperty)
}
@end 

The key is understanding the difference between categories and class extensions, see here: https://stackoverflow.com/a/4540582/703809

like image 107
lawicko Avatar answered May 20 '23 11:05

lawicko