iPhone内存管理与NSString问题

iPhone内存管理与NSString问题,iphone,objective-c,ios,Iphone,Objective C,Ios,新闻字符串发生了什么?这是我正在做的吗 orginalString首先保留计数1,当它被另一个指针newString引用时,其保留计数将为2?我是否需要在最后说self.orginalString=nil?有严重的内存泄漏,但不知道这与此有关 tmpString已分配并初始化 tmpString指向的字符串被复制到self.originalString,因为该属性声明为copy tmpString指向的字符串已正确释放;self.orginalString指向的字符串没有任何变化 创建一个新指针

新闻字符串发生了什么?这是我正在做的吗

orginalString首先保留计数1,当它被另一个指针newString引用时,其保留计数将为2?我是否需要在最后说self.orginalString=nil?有严重的内存泄漏,但不知道这与此有关

tmpString已分配并初始化

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

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

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

此时,如果您不发布self.orginalString,它将被泄漏

当你在目标C中处理记忆管理时,我的建议是不要在保留计数方面进行尝试和推理;retaincount只是ObjC运行时用来跟踪对象的机制;它的级别太低,并且周围有太多其他对象,无法增加或减少保留计数,因此您会立即失去计数

IMO认为,最好的方法是从所有权的角度进行推理:当一个对象想要拥有另一个对象的所有权时,它将发送一个retain;当它处理完它后,它会发送release。所有权是类的局部概念,因此很容易找到

因此,当您这样做时:

  NSString *newString =self.orginalString;  
newString只是指向非自有对象的指针;你不需要平衡分配和释放;相反,如果您这样做:

   NSString *newString =self.orginalString;  
当您处理完对象后,您将负责释放该对象

tmpString已分配并初始化

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

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

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

此时,如果您不发布self.orginalString,它将被泄漏

当你在目标C中处理记忆管理时,我的建议是不要在保留计数方面进行尝试和推理;retaincount只是ObjC运行时用来跟踪对象的机制;它的级别太低,并且周围有太多其他对象,无法增加或减少保留计数,因此您会立即失去计数

IMO认为,最好的方法是从所有权的角度进行推理:当一个对象想要拥有另一个对象的所有权时,它将发送一个retain;当它处理完它后,它会发送release。所有权是类的局部概念,因此很容易找到

因此,当您这样做时:

  NSString *newString =self.orginalString;  
newString只是指向非自有对象的指针;你不需要平衡分配和释放;相反,如果您这样做:

   NSString *newString =self.orginalString;  
处理完对象后,您将负责释放该对象。

您应该访问此网站。实际上,我们不应该用retaincount检查内存泄漏,至少对于NSString是这样

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

您应该访问此网站。实际上,我们不应该用retaincount检查内存泄漏,至少对于NSString是这样


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

使用仪器分析内存泄漏的原因。事实上,在使用仪器之前,请先进行Build=>Analysis。这将指出明显的内存泄漏。使用工具分析内存泄漏的原因。事实上,在使用工具之前,请先执行Build=>analyze。这将指出明显的内存泄漏。tnx你说如果我不释放它就会泄漏,是因为我说的NSString*newString=self.orginalString吗?我已经在dealloc中释放了它,我也必须在我的方法中禁用它吗?不,赋值NSString*newString=self.orginalString将不要求您再次释放该对象。但是,您需要在dealloc方法中释放self.orginalString,因为当您分配给它时,您获得了对象的所有权。如果你在dealloc中这样做,它已经足够了。tnx我需要在代码中重置它的值,所以在其他方法中,如果将它设置为零,它会产生后果吗?你可以任意多次将属性的值设置为零。我认为Kendall Helmstetter Geln关于XML的回答是正确的。如果您还有更多问题,请至少在应用他的建议后使用autorelease更新代码和您的发现,当alloc]init theXML.tnx您说如果我不发布它将泄漏,是因为我说NSString*newString=self.orginalStri吗
ng?我已经在dealloc中释放了它,我也必须在我的方法中禁用它吗?不,赋值NSString*newString=self.orginalString将不要求您再次释放该对象。但是,您需要在dealloc方法中释放self.orginalString,因为当您分配给它时,您获得了对象的所有权。如果你在dealloc中这样做,它已经足够了。tnx我需要在代码中重置它的值,所以在其他方法中,如果将它设置为零,它会产生后果吗?你可以任意多次将属性的值设置为零。我认为Kendall Helmstetter Geln关于XML的回答是正确的。如果您还有更多问题,请至少在应用他的建议后,在alloc]init theXML时使用autorelease更新代码和您的发现。
  NSString *newString =self.orginalString;  
   NSString *newString =self.orginalString;  
   NSString *newString = [self.orginalString retain];