消息总是被分派给一个对象指针,不管它是指向一个对象还是指向nil
. 此外,消息是在运行时发送的,因此编译器不能仅仅假设它nil_array
确实存在nil
并对其进行优化。如果初始化做了其他事情,nil_array
结果是一个实例怎么办?
这意味着您作为参数传递给您的方法的所有表达式都将被评估以便被传递,因此不会发生任何类型的短路。你的慢函数将被执行,如果它需要很长时间,它会影响你的程序的性能。
编辑:我刚刚为它准备了一个小测试用例(空的 Objective-C 命令行程序)。如果您运行它并观察调试器控制台,您会注意到所有三个调用的输出都function_that_takes_a_lot_of_time_to_compute()
出现了(以 5 秒为间隔),而只有t1
's 和t3
'test:
方法的输出出现 - 自然,因为它们不是nil
.
主文件
#import "Test.h"
int function_that_takes_a_lot_of_time_to_compute(void)
{
static int i = 1;
sleep(5);
NSLog(@"%d", i);
return i++;
}
int main(int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Test *t1 = [[Test alloc] init], *t2 = nil, *t3 = [[Test alloc] init];
[t1 test:function_that_takes_a_lot_of_time_to_compute()];
[t2 test:function_that_takes_a_lot_of_time_to_compute()]; // nil
[t3 test:function_that_takes_a_lot_of_time_to_compute()];
[t1 release];
[t3 release];
[pool drain];
return 0;
}
测试.h
@interface Test : NSObject {}
- (void)test:(int)arg;
@end
测试.m
@implementation Test
- (void)test:(int)arg
{
NSLog(@"Testing arg: %d", arg);
}
@end
输出
1
测试参数:1
2
3
测试参数:3