【问题标题】:NSString memory lifecycleNSString 内存生命周期
【发布时间】:2014-04-13 11:56:24
【问题描述】:

尝试了解 Objective C 中的内存管理。任何帮助将不胜感激。

NSString *myString;

上面这行做了什么,它是否为 myString 分配内存?如果是这样,那么有多少字节? 如果 myString 的声明为 myString 对象分配内存,那么编译器或运行时系统将如何知道 myString 对象将接收多大的字符串。我的意思是字符串可以是任何长度。那么应该分配多少内存呢?

myString =[NSString stringWithFormat:@"Testing String"];

当对象不再使用时,内存会发生什么?在app运行之前,内存会被释放还是被myString的内容占用?

【问题讨论】:

  • 您可能想尝试找到一本关于面向对象编程的好教科书,并研究 非常重要 object指针 指向一个对象。许多潜在的程序员都是这个话题的创始人。 (而且你真的不应该尝试 Objective-C 编程,除非你清楚地理解其中的区别。)

标签: objective-c


【解决方案1】:

NSString *myString; 不分配字符串。相反,它保留了足够的字节来保存指向字符串的指针;该指针的生命周期取决于该行在代码中的位置(否则无法控制)。

myString =[NSString stringWithFormat:@"Testing String"]; 进行分配*,字符串大小正好足以容纳您的格式产生的字符串;在这种情况下,对于字符“测试字符串”来说已经足够了。

myString 指针超出范围,并假设没有任何其他字符串副本,如果您使用的是ARC,该字符串将被释放。如果您不使用 ARC,则您有责任在使用完后将其释放。

分配: 一般来说,Objective C 分配看起来像pointer = [Class alloc];,实际上它更可能看起来像pointer = [[Class alloc] init];(或任何类的其他init* 方法)。 [NSString stringWithFormat:(NSString *), ...] 方法很方便(无论是完全还是本质上)[[NSString alloc] initWithFormat:(NSString *), ...]

【讨论】:

  • 应该注意一个经典的新手错误是做类似NSString* myString = [[NSString alloc] init]; myString = someOtherString;的事情,认为你需要先“分配”字符串(指针),然后才能给它分配任何东西。充其量分配/初始化是浪费的运动;在最坏的情况下(没有 ARC),它会造成严重的存储泄漏。
猜你喜欢
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
相关资源
最近更新 更多