简短而甜蜜:为什么以下的Objective-C代码块不会产生编译器错误/警告?
- (void)someMethod:(MyObject *)someArg {
MyObject *t = [self otherMethod:t.property]; // Typo. 't.property' should be 'someArg.property'
[t doSomething];
}
我理解运行时行为,因为't'在分配时实际指向无效的内存地址。
EG。上面的代码行在逻辑上等同于:
MyObject *t;
t = [self otherMethod:t.property];
[t doSomething];
在Java中(如果我没记错的话)通常会导致编译器错误,因为在调用property
getter时,变量t保证没有有效值。 (当然,它有一个值,但它不值得拥有。)
几分钟前我遇到了这个问题,花了我更长的时间来确定问题是什么。为什么编译器在正确初始化之前没有警告(在任何代码片段中)指针t
正在被使用?
答案 0 :(得分:2)
因为objective-c编译器与Java编译器无关,所以没有理由以与Java编译器相同的方式处理相同的错误情况。
我同意如果编译器至少在这样的情况下发出警告会更好,但是在一种允许直接操纵指针的语言中,很难可靠地检测到这种情况。例如:
MyObject* t;
MyObject** pointerToT = &t;
*pointerToT = [[MyObject alloc] init];
//now I can use 't', even though I never assigned anything to it directly
[t doSomething];