在定义的同一语句中使用变量?

时间:2011-03-20 04:42:05

标签: objective-c xcode compiler-construction llvm

简短而甜蜜:为什么以下的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正在被使用?

1 个答案:

答案 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];