在XCode 4.2中,我发现我可以写一个这样的语句:
[obj = obj method];
对此没有任何错误或警告。
所以,我想知道编译器将如何解释这个?这与:
相同obj = [obj method];
答案 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