为什么点语法不能用于返回类型为instancetype的方法?

Rei*_*ain 11 properties objective-c clang instancetype

假设我在NSObject上有一个定义以下方法的类别:

+ (instancetype)allocTemplate
{
    id instance = [self new];

    return instance;
}
Run Code Online (Sandbox Code Playgroud)

我有以下课程:

@interface FDActor : NSObject

@property (nonatomic, copy) NSString *name;

+ (void)sayHi;    

@end


@implementation FDActor

+ (void)sayHi
{
    [self allocTemplate].name;
}

@end
Run Code Online (Sandbox Code Playgroud)

[self allocTemplate].name如果自我是FDA的话,如何在编译时出错?

我知道如果你使用普通的消息发送语法,它是有效的,但我明显感兴趣的是点语法错误.

tap*_*api 3

看起来好像instancetype仅用于分配期间的类型检查,因此 FDActor *actor = [FDActor allocTemplate]不会产生警告。

如果我们转换 allocTemplate 的返回类型,问题就会消失。

- (void)sayHi { ((__typeof__(self))[[self class] allocTemplate]).name; }

但请注意,这仅适用于实例方法,因为实例的类型是另一个实例。另请注意,由于我们现在显式输入返回值,因此不再需要 allocTemplate 方法,如果我们正在寻找类型检查,那么我们甚至可以直接强制转换 nil ,它就会起作用。

如果我们在类方法中尝试同样的事情,它将不起作用

+ (void)sayHi { ((__typeof__(self) *)[self allocTemplate]).name; } 这是因为(__typeof__(self) *)doers 不评估FDActor *Class *ARC 会抱怨。看起来没有办法FDActor *在编译时从类方法中以通用方式解析类型信息。

我宁愿希望这个instancetype关键字更有用一点。