簡體   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