隐藏公共框架标头中的属性,但在内部保留可用

Min*_*gas 3 objective-c

我需要在类中包含从公共框架头中排除的属性,但它可以在其他框架类中内部使用.我现在做的是:

MyClass.h:

@interface MyClass: NSObject

@end
Run Code Online (Sandbox Code Playgroud)

MyClass的+ Internal.h

@interface MyClass (Internal)
@property (nonatomic, copy) NSString *mySecretProperty;
@end
Run Code Online (Sandbox Code Playgroud)

MyClass.m

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

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

@implementation MyClass
@end  
Run Code Online (Sandbox Code Playgroud)

我可以使用私人财产,如:

MyOtherClass.m:

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

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

但我不喜欢这个设置是我在我的Internal类别和匿名类别中有重复的属性声明.有没有办法改善这种设置?

law*_*cko 11

我认为你只能使用类扩展,不需要使用类别.快速修复是从括号中删除类别名称,将其转换为类扩展,然后从.m文件中删除类扩展声明.在此之后,您只需在框架类中导入扩展标头,并确保它是框架的私有标头.

MyClass.h

@interface MyClass: NSObject

@end
Run Code Online (Sandbox Code Playgroud)

MyClass的+ Internal.h

#import "MyClass.h"

@interface MyClass ()
@property (nonatomic, copy) NSString *mySecretProperty;
@end
Run Code Online (Sandbox Code Playgroud)

MyClass.m

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

@implementation MyClass
@end
Run Code Online (Sandbox Code Playgroud)

MyOtherClass.m:

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

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

关键是要了解类别和类扩展之间的区别,请参见此处:https://stackoverflow.com/a/4540582/703809