我正在使用第三方库,它不公开其 init 方法,并且从类级消息中执行一些专门的 I-don't-know-what。这是否禁止我进行子类化?
我做了一个测试用例(启用了 ARC)
啊
@interface A : NSObject
@property (nonatomic, strong) NSString * bar;
-(id) initWithAbar:(NSString *) bar;
+(id) aWithBar:(NSString *) bar;
@end
是
#import "A.h"
@implementation A
-(id) initWithAbar:(NSString *) bar
{
self = [super init];
if (self) {
self.bar = bar;
}
return self;
}
+(id) aWithBar:(NSString *) bar
{
return [[A alloc] initWithAbar:bar];
}
@end
溴化氢
#import <Foundation/Foundation.h>
#import "A.h"
@interface B : A
@property (nonatomic, strong) NSString *foo;
-(id) initWithFoo:(NSString *)foo bar:(NSString *)bar;
@end
BM
#import "B.h"
@implementation B
-(id) initWithFoo:(NSString *)foo bar:(NSString *)bar
{
self = (B*)[A aWithBar:bar]; // Still actually A, knew that by printing [self class];
if (self) {
self.foo = foo; // Error: unrecognized selector here
}
return self;
}
@end
假设我不能只调用 A's initWithAbar:
,那么我在继承 A 时有什么选择吗?如果 A 的 aWithBar 调用了 A 的 init,那么 init 有什么特别之处呢?