2011-04-08 149 views
4

我是iPhone開發新手,在跳入我的第一個應用程序之前,我做了大量的閱讀。所有這些閱讀都讓我明白,正確的內存管理是一件大事,所以我想做正確的事情。iPhone:內存管理新手問題

我剛剛完成我的第一個應用程序,並開始測試它的泄漏。有很多:) 我已經改變了代碼來解決泄漏,然後開始得到BAD_ACCESS異常。現在我的問題:

  • 我有一個UITextView對象,我們稱之爲'utv'。我看到它的'text'字段定義如下:

    @property(nonatomic,copy)NSString * text;

如果我寫了下面的代碼行:

utv.text = [NSString stringWithString:@"Blabla"]; 

我不應該關心的自動釋放池釋放字符串,對不對?因爲它使用複製?

  • 如果它被定義爲

    @屬性(非原子,保留)的NSString *文本;

    我應該還是不關心autorelease池,因爲保留提高了引用計數1?

  • 我可以知道何時自動釋放池將釋放一個字符串,我用stringWithString而不是initWithString創建?

謝謝! Eli

+0

只是在主要問題之外發表評論。今天我發現了WWDC2010視頻會議311:[用儀器進行高級內存分析](http://developer.apple.com/videos/wwdc/2010/)。我還是一個初學者,它給了我很多的理解,如何去追逐漏洞,拋棄內存以及如何處理內存警告。 – matm 2011-04-08 15:08:14

回答

3

你幾乎回答了你自己的問題,在我看來。如果屬性爲retain之一,則新值將在其合成的setter方法中發送retain消息,所以您不應該擔心它:)

以下是setter之間的代碼差異,以幫助您瞭解它們如何處理內存:

// assign 
property = newValue; 

// retain 
if (property != newValue) { 
    [property release]; 
    property = [newValue retain]; 
} 

// copy 
if (property != newValue) { 
    [property release]; 
    property = [newValue copy]; 
} 
+0

感謝您的回答。我剛剛閱讀了一些相關的問題,我看到有人寫道「obj = someValue」與「self.obj = someValue」不同。這是爲什麼?不要兩行代碼都調用setter? – 2011-04-08 15:16:54

+0

謝謝,這有很大的幫助。 – 2011-04-08 15:20:37

+0

@Eli - 不,第一個只分配對象 - 只有'self.obj = someValue'會調用屬性 – deanWombourne 2011-04-08 16:12:55

0

你是對的。當屬性設置爲保留或複製時,您不應該關心自動釋放池。你不會知道什麼時候NSAutoreleasePool會釋放你的字符串,但你可以安全地假設你可以在自由聲明的同一個方法中使用它。每個線程都應該有自己的NSAutoReleasePool,這些線程可以隨時排空,但通常在每個運行循環的開始時排空。

+0

你不能假設autorelease何時會觸發。 – Jordan 2011-04-08 15:10:42

+0

我知道,我告訴他的是,在同一個方法中使用autorelease對象是安全的。 – Joe 2011-04-08 15:12:23

1

不要考慮內存管理的autorelease池或保留計數。根據你是否擁有一個物體來考慮它。如果你擁有它,你有責任釋放它。

這些線的這兩個創建保留性能:

@property (nonatomic, copy) NSString *text; 
@property (nonatomic, retain) NSString *otherText; 

拷貝只是意味着保留一個副本,而不是原來。這兩個屬性都是內存管理的,因此您不必擔心正常使用中的保留或釋放。

self.text = string1; // this retains a copy of string1 
self.text = string2 // this releases the copy of string1 and retains the copy of string2 
self.text = nil; // this releases the copy of string2 

您擁有self.text和self.otherText,所以您需要在dealloc中釋放它們。

如果您沒有分配,新增,複製或保留一個對象,您不擁有它。如果你不擁有它,但你需要保證它在運行循環結束後堅持到底,通過保留它來聲明所有權。

+0

另一個優秀和明確的答案。非常感謝你。 – 2011-04-08 20:17:03

0

This是一個很好的內存管理讀取
希望這可以幫助別人。