问题
在 Objective-C 中使用私有类时如何隐藏它?
例如,如下所述
PrivateFilter
是我要隐藏的类。
CustomFilter
是我做的课,是开放的。
GPUImageFilter
是 Github 上的 public 类,也是开放的。并且CustomFilter
实际上包装了PrivateFilter
.
@interface CustomFilter : GPUImageFilter
@end
@interface PrivateFilter : GPUImageFilter
@end
可能的解决方案
所以有两种解决方案:
解决方案一:类集群
查看Apple 文档A Composite Object: An Example
中的示例。我按照这些步骤制作了以下代码。
// CustomFilter.h
@interface CustomFilter : GPUImageFilter
@end
// CustomFilter.m
@interface CustomFilter()
@property (nonatomic, strong) PrivateFilter *privateFilter;
@end
@implementation CustomFilter
- (instancetype)init
{
self = [super init];
if (self) {
_privateFilter = [[PrivateFilter alloc] init];
}
return self;
}
// and then override the most of GPUImageFilter functions...
@end
但不知何故它不起作用,所以我尝试了解决方案2。
解决方案 2:使用 PrivateFilter 初始化
// CustomFilter.h
@interface CustomFilter : GPUImageFilter
@end
// CustomFilter.m
@implementation CustomFilter
- (CustomFilter *)init
{
self = (CustomFilter *)[[PrivateFilter alloc] init];
return self;
}
@end
这行得通,但alloc
在init
. 所以我尝试解决方案3。
解决方案3:工厂类方法
// CustomFilter.h
@interface CustomFilter : GPUImageFilter
+ (CustomFilter *)filter;
@end
// CustomFilter.m
@implementation CustomFilter
+ (CustomFilter *)filter
{
CustomFilter *filter = (CustomFilter *)[[PrivateFilter alloc] init];
return filter;
}
@end
这可行,但它不能被继承,就像类集群一样。
重复问题
那么哪个是最好的解决方案?或者还有其他好的解决方案吗?