2011-08-07 120 views
0

我不知道爲什麼我的應用程序崩潰後,我正在做幾次:分配和釋放問題

potionsT是nonatomic,保留,只讀。

-(void)First:(NSString*)Potions { 

    potionsT = [[NSString alloc] initWithString:Potions]; 
} 

-(void)After:(NSString*)Potions { 
    [potionsT release]; 
    potionsT = [[NSString alloc] initWithString:Potions]; 

你看,我首先調用首先,之後我打電話了幾次後:和wopes,它崩潰。與ECX_BAD_ACCESS ..我很喜歡所有這些記憶管理的事情,我知道......謝謝!

回答

3

保留屬性的要點是它在處理保留和釋放時設置它。

- (void)first:(NSString*)potions 
{ 
    self.potionsT = potions; // will automatically release old value and retain new 
} 

- (void)after:(NSString*)potions 
{ 
    self.potionsT = potions; // same as above 
} 

還要注意如何重新命名PotionspotionsFirst:first:,並After:after:。 Objective-C的命名約定是用小寫字母和類名開頭的變量和方法。

+0

嘿,我試過,但它仍然崩潰.. – Eli

+0

一些更多的細節會很好,像調試器說什麼,或更多的代碼... –

2

您是否@synthesize@implementation屬於該類的屬性?如果是這樣,那麼你應該使用:

self.potionsT = Potions; 

如果使用

potionsT = ... 

,那麼你正在訪問的伊娃,而不是財產。要訪問屬性並讓它爲您執行內存管理,您必須在它之前添加一個實例引用,也可以是self。

如果您使用該屬性,則不應手動發佈potionsT,因爲該屬性已爲您執行此操作。

+0

嘿,我已經試過,但它仍然崩潰.. – Eli

+0

代碼崩潰可能有很多原因。我們必須看到更多的代碼才能知道它爲什麼會「崩潰」(在哪裏,如何?)。使用調試器來找出它發生的地方。 –

2

如果你已經設置了potionsT作爲一個屬性,你應該獲得這樣的說法:

-(void)first:(NSString*)potions { 
    self.potionsT = potions; 
} 

-(void)after:(NSString*)potions { 
    self.potionsT = potions; 
} 

在這兩種情況下,我改變了你的代碼以使用訪問器potionsT(這是什麼self.potionsT手段) 。我也沒有創建一個新的字符串,但只是保留提供的一個。由於NSString是不可變的,結果是一樣的。但爲獲得最佳效果,請將potionT媒體資源從retain更改爲copy。這樣,如果一個可變字符串被傳入,它將被複制而不是被保留(並且不變的字符串仍然會被保留)。

+0

嘿,我已經試過,但它仍然崩潰... – Eli

+1

「它崩潰」並沒有走很遠解決問題。查看產生的堆棧跟蹤並找出*什麼*崩潰。什麼線?如果你得到了EXC_BAD_ACCESS,那麼你正在引用一個不好的指針,所以找出它是什麼指針以及它是如何失效的。 – Caleb