Файл это под C NULL указатель типа вещи.
Вот пример:
#import <Foundation/Foundation.h>
void test(void){
NSString *test1, *test2, *test3;
test1=nil;
// Note: NSString would USUALLY be aloc then init before use...
[test1 isEqual:@"static object string"];
[test2 isEqual:@"static string"];
[test3 isEqual:test1];
}
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
test();
[pool drain];
return 0;
}
Теперь поместите точку останова на test1=nil
в xcode и запустите. На моей машине я получаю:
test1=(NSString *) 0x0 <nil>
test2=(NSString *) 0x0 <nil>
test3=(NSString *) 0x7fff84db7dd7 Invalid
Если вы запустите его, вы получите EXC_BAD_ACCESS
и завершение, когда он попытается выполнить [test3 isEqual:test1]
. Вы можете использовать нулевые значения test1 и (случайные?) Нулевые значения test2, но использовать случайное значение в test3: death.
Теперь измените эту строку на test1=test2=test3=nil;
Запустите ее снова. Работает отлично.
Важная концепция: Вы можете правильно отправить сообщение на ноль в Objective-C.
Точно так же, как может быть хорошей практикой присваивать указатель C безопасному значению, когда оно не используется, nil
является безопасным значением в Objective-C, пока оно не будет присвоено чему-либо еще. Для программиста, который написал пример - это была, вероятно, мышечная память. Нет необходимости в конкретном случае, но безопаснее, чем случайное значение.