[英]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.