我们都熟悉以下用于实例化类实例的模式:
+ (instancetype)createInstance {
return [[self alloc] init];
}
这是有效的,因为在这种情况下,“self”是指类,而不是从类蓝图构建的对象。
我们也知道这个声明,最常用于避免保留周期:
typeof(self) someStrongSelf = self;
这允许self
的类型是动态的,并且可以在任何需要的地方复制粘贴代码,无论是哪个类。
我的问题涉及在从类方法实例化时组合上述两种模式:
+ (instancetype)createInstance:(MyObject*)dependency {
typeof(self) instance = [[self alloc] init];
instance.dependency = dependency;
return instance;
}
这不起作用,因为self
是一个类,而typeof(class)
只是一个Class
,但是有一些机制用于等同于instancetype
的局部变量是否允许我与typeof(实例)具有相同的灵活性?例如:
+ (instancetype)createInstance:(MyObject*)dependency {
instanceof(self) instance = [[self alloc] init]; //desired keyword
instance.dependency = dependency;
return instance;
}
如果我真的想要这种形式化,我知道另一种方法是定义一个与上面基本相同的协议,但我很好奇Objective-C是否允许开箱即用的所需声明样式。 / p>
答案 0 :(得分:0)
我理解你在寻找什么,但没有instanceof(self)
模式。以下内容实现了您的目标,但诚然不具备typeof(self)
模式的优雅:
@interface Foo: NSObject
@property (nonatomic, copy) NSString *string;
@end
@implementation Foo
+ (instancetype)fooWithString:(NSString *)string {
Foo *foo = [[self alloc] init];
foo.string = string;
return foo;
}
@end
@interface Foobar: Foo
// perhaps some more properties here
@end
@implementation Foobar
// and perhaps some more methods here
@end
此实现表明,方便方法仍允许子类化。即,你可以这样做:
Foobar *foobar = [Foobar fooWithString:@"baz"];
结果对象将是Foobar
个实例。