2011-05-10 86 views
0

這是我在ObjectiveC中的第二天編程,所以我爲noob問題表示歉意。客觀C變量可通過多種方法訪問

我有一個視圖控制器使用異步和asihttprequest,做一個API調用:

@synthesize loadingStatus; 
- (void)loadStatsData 
{ 
    [indicator setHidden:NO]; 

    loadingStatus = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ]; 

    [RESTApiController request:@"/method.json" method:@"GET" options:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObject:@"amount"] forKeys:[NSArray arrayWithObject:@"receiving"] ] parent:self]; 
} 

和接收這樣的:

應用崩潰時它會嘗試使用loadingStatus變量在requestFinished()。我想不知怎麼變量被取消了,但我不確定如何解決這個問題。

兩個問題: 1)我怎樣才能保持loadingStatus的狀態跨越方法的調用,所以我可以在我寫的代碼 2的方式來使用它)有沒有達到我的檢查目標的更好的方法,如果API調用完成並隱藏ActivityIndi​​cator?

-M。

+0

你會得到什麼錯誤? – 2011-05-10 23:14:18

回答

3

做這種方式:指loadingStatus作爲self.loadingStatus

self.loadingStatus = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ]; 

這樣的話,它會通過訪問,並做了就可以了(在.h文件中的部分@property)保留。

另外,編程提示:將行分成更小的語句,以便更易於調試。

+1

但是,只有當屬性被聲明爲'(retain)'時。 – 2011-05-10 23:26:09

+0

@Squeegy - 很對。謝謝。 – Rayfleck 2011-05-10 23:27:11

2

你是對的,loadingStatus正在被釋放。這是因爲價值正在自動釋放。

如果更改

loadingStatus = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ]; 

loadingStatus = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ]; 
[loadingStatus retain]; 

loadingStatus = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ]; 

那麼你的代碼將工作。

原因是從dictionaryWithObjects:forKeys返回的對象已經對它調用了autorelease,因此如果要避免它被釋放,則需要調用retain。

作爲參考,如果調用alloc/init,將得到一個保留計數爲1的對象。如果使用諸如dictionaryWithObjects:forKeys之類的方法:將得到一個保留計數爲0的對象。要解決這個問題,只需添加一個保留,你就會很好。

蘋果有一些非常好的內存管理文檔。我建議檢查出來,當你有機會

Memory Management Guide

Memory Management Rules

希望這有助於!

-Scott