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?
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With