【问题标题】:iPhone memory management with NSString problem带有 NSString 问题的 iPhone 内存管理
【发布时间】:2011-10-19 18:42:18
【问题描述】:
@property (nonatomic,copy) NSString *orginalString;

..
NSString *tmpString =[[NSString alloc] init];
self.orginalString=tmpString;
[tmpString release];
NSString *newString =self.orginalString;  

newString 发生了什么?,我在做什么正确吗?

最初的原始字符串保留计数为1,当它被另一个指针“newString”引用时,它的保留计数将为2?最后我需要说“self.orginalString=nil”吗?存在严重的内存泄漏,但不知道这与此有关。

【问题讨论】:

  • 使用 Instruments 分析导致内存泄漏的原因。
  • 其实在使用 Instruments 之前,先做 Build => Analyze。这将指出明显的内存泄漏。

标签: iphone objective-c ios


【解决方案1】:
  NSString *tmpString =[[NSString alloc] init];

tmpString被分配并初始化

  self.orginalString=tmpString;

tmpString 指向的字符串被复制到self.originalString(因为该属性被声明为copy);

  [tmpString release];

tmpString 指向的字符串被正确释放; self.orginalString 指向的字符串没有任何反应;

  NSString *newString =self.orginalString;  

创建并初始化一个新指针以指向self.orginalString指向的同一字符串; self.orginalString 保留计数没有任何反应;它只是指向同一个对象的第二个指针;

此时,如果你不在某个地方发布self.orginalString,它就会被泄露。

当您在 OBjective C 中处理内存管理时,我的建议不是“保留计数”方面的尝试和推理;保留计数只是 ObjC 运行时用来跟踪对象的机制;它太低级,周围有太多其他对象,无法增加或减少保留计数,以至于您立即失去计数。

IMO 最好的方法是根据所有权进行推理:当一个对象想要拥有另一个对象时,它会发送一个retain;完成后,它会发送release。所有权是类的本地概念,因此很容易追踪。

所以,当你这样做时:

   NSString *newString =self.orginalString;  

newString 只是一个指向非拥有对象的指针;您无需在分配与释放之间取得平衡;相反,如果你这样做:

   NSString *newString = [self.orginalString retain];

当你完成对象时,你要让自己负责释放它。

【讨论】:

  • tnx 你说如果我不发布它会泄漏,是不是因为我说 NSString *newString =self.orginalString?而且我已经在 dealloc 中释放了它,我还必须在我的方法中取消它吗?
  • 不,分配NSString *newString =self.orginalString 不会要求您再次释放该对象。不过,您需要在dealloc 方法中释放self.orginalString,因为当您分配给它时,您就获得了该对象的所有权。如果你在dealloc做,就已经足够了。
  • tnx 我需要在代码中重置它的值,所以用其他方法取消它,它有后果吗?
  • 您可以将属性的值设置为nil,次数不限。
  • 我认为 Kendall Helmstetter Geln 对theXML 的回答是正确的。如果您有更多问题,请在应用他的建议后至少更新代码和您的发现(alloc] inittheXML 时使用 autorelease。
【解决方案2】:

您应该访问此link。实际上,我们不应该使用保留计数来检查内存泄漏,至少对于 NSString。

要检查内存泄漏,请始终使用 Xcode 附带的 Instruments。

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 2011-01-07
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多