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];
}
}