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的话,如何在编译时出错?
我知道如果你使用普通的消息发送语法,它是有效的,但我明显感兴趣的是点语法错误.
看起来好像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关键字更有用一点。
| 归档时间: |
|
| 查看次数: |
241 次 |
| 最近记录: |