2012-03-16 45 views
1

在Xcode 4.2,我发现我可以写如下语句:该语句如何被编译器解释?

[obj = obj method]; 

而且没有错误或警告这一点。

所以,我想知道编译器将如何解释这个?这是相同的:

obj = [obj method]; 

回答

3

打开您的警告级别。锵发出警告(-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); 

...但为什么你会写使用这个确切的语句的程序?对于很多来说,这会令人困惑或者尴尬。

+0

感谢replay.I发现在我的项目的代码,我将其更改为obj = [obj method]; – zxhfirefox 2012-03-16 08:18:44

+0

@zxhfirefox所以它是尴尬和/或混淆我们俩=) – justin 2012-03-16 08:21:12

+0

是的,我只是想知道为什么没有警告,以及如何解释。 – zxhfirefox 2012-03-16 08:23:20

1

编译器将执行分配,然后它将调用该方法。在一个简单的测试可以看到的结果:

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

@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 
+0

感谢您的测试和重播。哦,我发现你的名字与贾斯汀相似.. – zxhfirefox 2012-03-16 08:25:04