编译器将如何解释此语句?

时间:2012-03-16 07:04:02

标签: objective-c ios xcode

在XCode 4.2中,我发现我可以写一个这样的语句:

[obj = obj method];

对此没有任何错误或警告。

所以,我想知道编译器将如何解释这个?这与:

相同
obj = [obj method];

2 个答案:

答案 0 :(得分:3)

调高警告级别。 Clang 发出警告(-Wself-assign):

warning: explicitly assigning a variable of type 'NSObject *' to itself [-Wself-assign]
                  [obj = obj method];

obj = [obj method];相同。它被解释为:

obj = obj;
[obj method];

并且编译器可以省略自我分配。也就是说,此程序打印a

NSString * a = @"a";
NSString * b = @"b";
NSLog(@"%@", b = a);

...但是你为什么要用这个确切的陈述写一个程序?对于许多而言,解释或者只是尴尬会令人困惑。

答案 1 :(得分:1)

编译器将执行赋值,然后它将调用该方法。在简单的测试中,您可以看到结果:

定义两个支持相同方法的对象:

@interface testA : NSObject
- (NSString*)o;
@end
@interface testB : NSObject
- (NSString*)o;
@end
@implementation testA
- (NSString *)o
{
    return @"A";
}
@end
@implementation testB
- (NSString *)o
{
    return @"B";
}
@end

运行一个简单的测试用例:

testA *objA = [[testA alloc] init];
testB *objB = [[testB alloc] init];
NSLog(@"test: %@", [objA = objB o]);

输出结果为:

test: B

是的,有警告,但正如您所说,代码没有错误。

更进一步,您可以看到objA已被重新分配:

NSLog(@"test: %@", [objA o]);

输出:

test: B