安装NSString,它是如何工作的?

时间:2009-08-28 15:12:23

标签: objective-c xcode memory nsstring

这个问题是从前一个问题开始的,这引发了另一个问题。我想要理解的是,当这个例子中的指针和对象被创建时,最终会发生什么。我仍然试图理解这一点,所以请原谅我可能做出的任何错误假设。

// 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会发生什么?

1 个答案:

答案 0 :(得分:2)

  1. 您正在创建一个初始化为nil的指针。如果您熟悉C或Java,那么nilNULLnull基本相同 - 它实际上是指向任何内容的指针。
  2. 是。 @"StarWars"被称为“字符串文字”。将字符串文字视为由程序存储的“永久”字符串,gName(在本例中)是指向该字符串的内存位置的指针。
  3. 是的 - 该行确保传入的gName与对象的geekName变量不同。假设检查不存在,并且gNamegeekName指向相同的字符串 - 那么下一行将释放该字符串,这可能使 next 行无效(它会复制一个已发布的字符串 - 非常糟糕!)。
  4. 假设geekName仍然是nil,那么是的,没有任何东西被释放;或者更确切地说,release消息被发送到nil对象,该消息对消息没有任何作用。 (与C或Java不同,在Objective-C中,您可以向nil发送消息 - 但忽略所有此类消息,nil是所有此类消息的返回值。)
  5. 您创建了gName的副本,以防gName 确实 NSMutableString的实例 - 您不希望其他代码改变您将其视为不可变的字符串。但是gName指向的原始对象会发生什么?嗯,这取决于呼叫者使用它做什么。它可以被释放,它可以被保留,它可以被传递给另一个对象......你真的不知道。在这种特殊情况下,由于gName指向字符串文字“StarWars”,因此该对象没有任何反应(因为它是一个字符串文字 - 见上文)。并且指针本身仅在此方法的范围内有效,并在方法返回后消失。