Objective c NSString的Setter,它是如何工作的?

Objective c NSString的Setter,它是如何工作的?,objective-c,xcode,memory,nsstring,Objective C,Xcode,Memory,Nsstring,这个问题是上一个问题的后续问题,提出了另一个问题。我试图理解的是,本例中的指针和对象是在什么时候创建的,以及它们最终会发生什么。我仍在努力解决这个问题,所以请原谅我可能做出的任何错误假设 // MAIN int main (int argc, const char * argv[]) { PlanetClass *newPlanet_01 = [[PlanetClass alloc] init]; [newPlanet_01 setGeekName:@"StarWars"]; }

这个问题是上一个问题的后续问题,提出了另一个问题。我试图理解的是,本例中的指针和对象是在什么时候创建的,以及它们最终会发生什么。我仍在努力解决这个问题,所以请原谅我可能做出的任何错误假设

// MAIN
int main (int argc, const char * argv[]) {
    PlanetClass *newPlanet_01 = [[PlanetClass alloc] init];
    [newPlanet_01 setGeekName:@"StarWars"];
}

(A) 。。。首次创建PlanetClass“newPlanet_01”的实例时,是创建了NSString实例变量对象,还是仅创建了指向未来可能对象的指针?如果它只是一个指针,那么我稍后在setter中发布什么,因为它只是一个指针,而不是指向对象的指针

(B) 。。。在上面的示例中,“gName”是指向NSString对象@“StarWars”的指针

(C) 。。。接下来是指针geekName与gName不同(即如果geekName尚未指向@“星球大战”)

(D) 。。。geekName发布,第一次运行代码时发布的内容,我的理解是geekName只是一个指向的指针,并不指向任何东西。还是第一次发布就没有发布任何东西

(E) 。。。最后geekName=[gName copy];新发布的geekName现在被指定指向gName的一个副本,原始gName会发生什么变化

  • 您正在创建一个初始化为
    nil
    的指针。如果您熟悉C或Java,那么
    nil
    NULL
    NULL
    基本上是一样的——它实际上是指向空的指针
  • 对<代码>@“星球大战”称为“字符串文字”。将字符串文字视为程序存储的“永久”字符串,
    gName
    (在本例中)是指向该字符串的内存位置的指针
  • 是的——该行确保传入的
    gName
    与对象的
    geekName
    变量不同。假设check不在那里,并且
    gName
    geekName
    指向同一个字符串——那么下一行将释放该字符串,这可能使下一行无效(它将复制一个释放的字符串——非常糟糕!)
  • 假设
    geekName
    仍为
    nil
    ,则为是,不发布任何内容;或者更确切地说,
    release
    消息被发送到
    nil
    对象,该对象对消息不做任何处理。(与C或Java不同,在Objective-C中,您可以将消息发送到
    nil
    ——但会忽略所有此类消息,
    nil
    是所有此类消息的返回值)
  • 如果
    gName
    实际上是
    NSMutableString
    的一个实例,则创建
    gName
    的副本——您不希望其他代码对您视为不可变的字符串进行变异。但是
    gName
    指向的原始对象会发生什么变化?嗯,这取决于打电话的人用它做什么。它可以被释放,可以被保留,可以被传递给另一个对象……你真的不知道。在本例中,由于
    gName
    指向字符串文字“StarWars”,因此该对象不会发生任何变化(因为它是字符串文字,请参见上文)。指针本身只在这个方法的作用域内有效,一旦这个方法返回,指针就会消失

  • 我有一个关于5/E的问题。在这种情况下,这是内存泄漏吗?常量字符串会发生什么变化?他们的记忆是如何恢复的?非常感谢,太好了。关于(5/E),我猜当它超出范围时会自动销毁(自动),但这只是一个猜测,因为我已经做了8天:)这不是内存泄漏。您不会从字符串常量中回收内存——它们会在程序运行期间一直存在。对于字符串常量,用于创建它们的代码由编译器发出(因此是可执行二进制文件的一部分)——具体地说,它们存储在称为二进制文件“数据段”的区域中(程序指令存储在“文本段”中)。因此,您不必担心“释放”或“泄漏”字符串常量的内存。(这至少适用于C和C派生语言,如ObjC。)阅读内存管理和字符串编程指南(“创建字符串”部分是一个很好的开始)。感谢本尼迪克特,刚开始的时候,我仍然在寻找我的脚,关于资源在网络上的位置,非常感谢指针,我将抓取PDF版本并看一看。
    // 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];
        }
    }