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