0

问题

在 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

这行得通,但allocinit. 所以我尝试解决方案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

这可行,但它不能被继承,就像类集群一样。

重复问题

那么哪个是最好的解决方案?或者还有其他好的解决方案吗?

4

1 回答 1

0

我认为您需要协议,而不是CustomFilter工厂方法。如果你需要一些GPUImageFilter子类,你可以制作GPUImageFilter<CustomFilter>

//CustomFilter.h
@protocol CustomFilter

...

@end

typedef GPUImageFilter<CustomFilter> CustomFilter;

//PrivateFilter.h
#import "CustomFilter.h"
@interface PrivateFitler: CustomFilter
...
@end

//GPUImageFilter+CustomFilter.h
@interface GPUImageFilter(CustomFilter)

+ (CustomFilter *)filter;

@end

//GPUImageFilter+CustomFilter.m
#import "PrivateFilter.h"

@implementation GPUImageFilter(CustomFilter)

+ (CustomFilter *)filter
{
    return [[PrivateFilter alloc] init;
}
@end

使用这种方法,如果您忘记实现某些方法,Xcode 甚至会给您警告。

于 2019-01-18T10:45:41.233 回答