Objective-C的(id)方法是否仅用于初始化alloc
?
NSString *stringC = @"My World";
NSString *sample = [[NSString alloc] initWithString:stringC];
Objective-C的(id)方法是否仅用于初始化alloc
?
NSString *stringC = @"My World";
NSString *sample = [[NSString alloc] initWithString:stringC];
Objective-C 的 init 方法仅适用于新分配的实例,原因如下:
init 方法允许重新分配self
并返回与关联所做的不同的指针alloc
(这就是为什么您总是将变量分配为 init 的返回)。这意味着在先前初始化的对象上调用 init 可能会给你一个指向新内存的指针,这会产生一些问题。
首先,如果您不将新指针分配给您的变量,那将毫无意义或更糟。其次,任何指向“旧”对象的附加指针现在都是“悬空的”,这将变得令人讨厌。
就@"foo"
构造而言,它大致类似于 C 中的 const 字符串(NSStrings 是不可变的,顺便说一句),但它将是指向 NSString 实例的指针,而不是指向 in-volatile char 的指针,你不需要给init
它。我不确定你是否错误地遗漏了星号,但 @"" 确实会产生一个指向NSString 的指针,因此该行需要星号,就像下一行一样。
id 是 Objective-Cvoid *
对对象的特殊处理,它本质上告诉编译器两件事:
#2 有一个典型的含义:你可以向它发送消息
与 void * 类似,您可以在需要其他对象类型且编译器不会抱怨的情况下将类型转换为 (id) 的东西传递出去。
最好说在 init* 方法之前,你应该分配。
例如,
NSString * test = [NSString stringWithFormat:@"hello world"];
也返回一个 ID,但不是在“alloc”调用之后。