繁体   English   中英

iPhone内存管理出现NSString问题

[英]iPhone memory management with NSString problem

@property (nonatomic,copy) NSString *orginalString;

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

newString在这里会发生什么?,这是正确的吗?

orginalString首先保留计数为1,而当另一个指针“ newString”引用它时,其保留计数将为2? 我到底需要说“ self.orginalString = nil”吗? 有严重的内存泄漏,但不知道这与此有关。

  NSString *tmpString =[[NSString alloc] init]; 

tmpString已分配并初始化

  self.orginalString=tmpString; 

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

  [tmpString release]; 

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

  NSString *newString =self.orginalString; 

创建一个新的指针并使其指向由self.orginalString指向的同一字符串; self.orginalString保留计数没有任何self.orginalString 它只是指向同一对象的第二个指针;

在这一点上,如果您不释放self.orginalString ,它将被泄漏。

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

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

因此,当您这样做时:

   NSString *newString =self.orginalString;  

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

   NSString *newString = [self.orginalString retain];

使用完对象后,您就要自己负责释放对象。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM