Objective-C类方法“self”类型的局部变量

时间:2017-03-21 18:26:37

标签: objective-c dynamic-typing

我们都熟悉以下用于实例化类实例的模式:

+ (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>

1 个答案:

答案 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个实例。