这个问题是从前一个问题开始的,这引发了另一个问题。我想要理解的是,当这个例子中的指针和对象被创建时,最终会发生什么。我仍然试图理解这一点,所以请原谅我可能做出的任何错误假设。
// MAIN
int main (int argc, const char * argv[]) {
PlanetClass *newPlanet_01 = [[PlanetClass alloc] init];
[newPlanet_01 setGeekName:@"StarWars"];
}
// CLASS
@interface PlanetClass : NSObject {
NSString *geekName;
}
- (NSString*) geekName;
- (void) setGeekName:(NSString*)gName;
@end
// SETTER
- (void)setGeekName:(NSString *)gName {
if (geekName != gName) {
[geekName release];
geekName = [gName copy];
}
}
(A)......当首次创建PlanetClass“newPlanet_01”的实例时,是创建了NSString实例变量对象,还是只是指向可能的未来对象的指针?如果它只是一个指针,我后来在setter中释放的只是一个指针,而不是一个指向对象的指针?
(B)...在上面的例子中,“gName”是指向NSString对象@“StarWars”的指针?
(C)...接下来是与gName不同的指针geekName(即如果geekName还没有指向@“StarWars”)
(D)... geekName release,第一次运行代码时发布的内容,我的理解是geekName只是一个指向不指向任何东西的指针。或者第一次释放不释放任何东西?
(E)......最后geekName = [gName copy];新发布的geekName现在被指定为指向gName的副本,原始gName会发生什么?
答案 0 :(得分:2)
nil
的指针。如果您熟悉C或Java,那么nil
与NULL
或null
基本相同 - 它实际上是指向任何内容的指针。@"StarWars"
被称为“字符串文字”。将字符串文字视为由程序存储的“永久”字符串,gName
(在本例中)是指向该字符串的内存位置的指针。gName
与对象的geekName
变量不同。假设检查不存在,并且gName
和geekName
指向相同的字符串 - 那么下一行将释放该字符串,这可能使 next 行无效(它会复制一个已发布的字符串 - 非常糟糕!)。geekName
仍然是nil
,那么是的,没有任何东西被释放;或者更确切地说,release
消息被发送到nil
对象,该消息对消息没有任何作用。 (与C或Java不同,在Objective-C中,您可以向nil
发送消息 - 但忽略所有此类消息,nil
是所有此类消息的返回值。)gName
的副本,以防gName
确实 NSMutableString
的实例 - 您不希望其他代码改变您将其视为不可变的字符串。但是gName
指向的原始对象会发生什么?嗯,这取决于呼叫者使用它做什么。它可以被释放,它可以被保留,它可以被传递给另一个对象......你真的不知道。在这种特殊情况下,由于gName
指向字符串文字“StarWars”,因此该对象没有任何反应(因为它是一个字符串文字 - 见上文)。并且指针本身仅在此方法的范围内有效,并在方法返回后消失。