2011-06-30 52 views
1

我有幾個日期和字符串被宣佈爲nonatomic和保留。self.string沒有保留導致內存泄漏iphone

當我設置日期或更改字符串使用self.string它不會被保留。如果我強制[string retain]我沒有問題,雖然這會造成內存泄漏。

任何想法或如何或我在做什麼錯?

乾杯

更新:

@property (nonatomic, retain)NSDate *time; 
    self.time = [cal dateFromComponents:comps]; 

self.time不保留。我必須[time retain];

+0

您將需要顯示一些你正在嘗試的代碼示例。 – dredful

+2

您需要提供示例代碼,如果您正在正確使用該屬性,則可能會發生其他情況。 – Joe

+0

你爲什麼認爲它不保留?其實,如果聲明正確的話。你需要顯示更多的代碼。 – Eiko

回答

1

您要麼釋放字符串兩次,要麼在釋放後訪問它。如果您發佈了一些代碼,這將有助於確定發生了什麼事情,如果這還不夠用。

+0

其唯一發布在dealloc你... – Dan

+0

然後,你將不得不張貼一些代碼。還有什麼是你得到的確切的錯誤信息? – Jamie

+0

沒有錯誤,但是當我再次使用它的空 – Dan

0

考慮序列:

 
0 NSObject *obj = [[NSObject alloc] init]; 
1 [obj retain] 
2 [obj release] 
3 [obj release] 
4 NSLog("@%@",obj); 
5 [obj retain] 

會崩潰第4行(OBJ已釋放),而序列:

 
0 NSObject *obj = [[NSObject alloc] init]; 
1 [obj retain] 
2 [obj retain] 
3 [obj release] 
4 [obj release] 
4 NSLog("@%@",obj); 

會泄漏(OBJ保留計數爲1)。

正如你可以看到相同的操作,但以不同的順序可以改變你的對象從額外釋放到泄漏。

0

您是否合成了setter和getter方法?它們是由包括代碼.m文件以下行合成:

@synthesize time; 

一般情況下,你會在行之後這樣做的權利:

@implementation YourClass 

這就是實際產生保留的方法當您將其設置爲變量時,如下所示:

self.time = [cal dateFromComponents:comps]; 
+0

你應該知道前綴爲'self'的對象是viewController的屬性,因此合成 –

+0

這是不正確的。屬性只允許使用點符號(例如'self.time'),但不要合成setter和getters。如果你想綜合它們,你必須明確地做到這一點。然後,它們將根據財產的規則生成(例如保留)。此外,屬性可以與任何對象一起使用,而不僅僅是視圖控制器。 –

+0

viewController就是一個例子。 –

0

現在要學習的最好的事情是如何使用工具找到這些問題的原因。

在Xcode 4中進入產品/配置文件,您的項目將被編譯並出現Instruments窗口。選擇Allocations樂器,然後通過單擊看起來像REC按鈕的紅色按鈕停止自動開始執行。

點擊Allocations樂器前面的小i按鈕。並選擇「記錄引用計數」和「啓用NSZombie檢測」,現在再次單擊同樣的紅色按鈕再次運行。重現問題,當它回到儀器窗口時,您會看到一個對話框,單擊箭頭並搜索問題的起源。國際海事組織你應該看看你的對象被錯誤地釋放。

enter image description here