在Xcode 4.2,我发现我可以写如下语句:该语句如何被编译器解释?
[obj = obj method];
而且没有错误或警告这一点。
所以,我想知道编译器将如何解释这个?这是相同的:
obj = [obj method];
在Xcode 4.2,我发现我可以写如下语句:该语句如何被编译器解释?
[obj = obj method];
而且没有错误或警告这一点。
所以,我想知道编译器将如何解释这个?这是相同的:
obj = [obj method];
打开您的警告级别。锵将发出警告(-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);
...但为什么你会写使用这个确切的语句的程序?对于很多人来说,这会令人困惑或者尴尬。
编译器将执行分配,然后它将调用该方法。在一个简单的测试可以看到的结果:
定义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
感谢您的测试和重播。哦,我发现你的名字与贾斯汀相似.. – zxhfirefox 2012-03-16 08:25:04
感谢replay.I发现在我的项目的代码,我将其更改为obj = [obj method]; – zxhfirefox 2012-03-16 08:18:44
@zxhfirefox所以它是尴尬和/或混淆我们俩=) – justin 2012-03-16 08:21:12
是的,我只是想知道为什么没有警告,以及如何解释。 – zxhfirefox 2012-03-16 08:23:20