2011-08-04 40 views
0

一個ASIFormDataRequest後,我從JSON創建一個臨時的NSMutableArray * resultArray然後將其添加到規定的NSMutableArray * myData的如何維護陣列的方法以外的目標C

-(void)viewDidLoad{ 
    myData = [[NSMutableArray alloc] init]; 
    //request that calls gotInfo method 
} 

-(void)gotInfo:(ASIFormDataRequest *)request{ 
    NSString *responseString = [request responseString]; 
    NSMutableArray *resultArray = [responseString yajl_JSON]; 
    [myData addObject:resultArray]; 
} 

-(IBAction)doSomethingWithData:(id)sender{ 
    //something with myData 
} 

,但是當我嘗試調用的myData從gotInfo:方法以外,我得到錯誤的訪問錯誤,當我檢查方法以外的myData時,它顯示kern_protection_failure。所以我猜測,除了方法之外,resultArray顯然已經發布,但它也從myData中釋放出來,因爲myData中的對象共享相同的內存位置? 我也試過

-(void)gotInfo:(ASIFormDataRequest *)request{ 
    NSString *responseString = [request responseString]; 
    [myData addObject:[responseString yajl_JSON]]; 
} 

如何保存myData?

#import <UIKit/UIKit.h> 

@class ASIFormDataRequest; 

@interface EventsTableController : UITableViewController <UITableViewDataSource>{ 
    NSMutableArray *myData; 
} 
-(void)gotInfo:(ASIFormDataRequest *)request; 

UPDATE:

所以在GBD中,myData的分配爲0x5e96560所以我也

po 0x5e96560 

,然後我得到的

在我的頭文件

EXC_BAD_ACCESS,原因是地址爲KERN_PROTECTION_FAILURE:0x00000009

但如果我這樣做

po [[0x5e96560 objectAtIndex:0] objectForKey:@"key"] 

然後我得到的價值! whyyyyyy?

+0

可能您張貼在那裏你初始化'myData'的代碼? – Saphrosit

+0

@Saphrosit:我使用代碼 –

+0

更新了我的文章由於您正在向數組myData添加對象[responseString yajl_JSON],因此數組myData將對象的保留計數增加1,因此它可能必須處理方法yajl_JSON 。你確定它返回一個NSMutableArray指針嗎? – msgambel

回答

0
@property(nonatomic,retain) NSMutableArray *myData 

和創建對象

self.myData = [[NSMutableArray alloc] init]; 

// and i assume your resultArray is a mature NSMutableArray object 
[self.myData addObject:resultArray]; 

使用複製我能想到的最好的辦法,就是要始終設置的NSString屬性設置爲 「複製」而不是保留。這樣你就可以從Leaks儀器獲得更準確的讀數,如果你搞砸了,忘記釋放一個對象所持有的字符串。複製的其他用途需要更仔細地考慮。

注意:您有責任在不使用該變量後釋放myData。

+0

我試過了你的代碼,但仍然是同樣的kern失敗。我會仔細檢查以確保結果沒有任何問題ArrayArray –

+1

啓用** NSDebugEnabled ** ** NSZombieEnabled ** ** MallocStackLogging ** ** MallocStackLoggingNoCompact **請參閱http://42games.net/quick -note-on-setting-nszombieenabled-environment-variable-in-xcode-4/* _你會更詳細地瞭解error_ *,那麼我們可以看到什麼是確切的問題?當您的程序正在運行時,打開一個終端,執行一個 ** ps -ax ** 來查找您的進程的pid,然後鍵入 **泄漏(pid)** 獲取有關內存泄漏的信息走了。 –

+0

我是否在gdb中鍵入ps-ax並泄漏(pid)? –

0

您沒有任何方法可以正確訪問myData,因爲您將它聲明爲EventsTableController中的成員,但是不要爲其設置@property,也不要將其合成。通過在你的EventsTableController.m文件中綜合它,你告訴xcode生成你需要正確觸摸myData的getter/setters,這是你的程序看起來失敗的地方。如果你這樣做,這應該可以解決你的問題。

-Karoly

+0

我認爲setter/getters只有在我的EventsTableController的一個實例是從另一個類創建時才使用。我添加了'@property(nonatomic,copy)NSMutableArray * myData'並添加了綜合,但是我仍然得到了kern保護失敗 –

+0

@Andrew Park:嗯,你在哪裏初始化myData?可能就是這樣,雖然通常會產生一個EXC_BAD_ACCESS,但我還沒有真正看到過保護失敗。 –

+0

除非需要另一個類來訪問該對象,否則根本不需要myData的任何getter和setter。 – msgambel

0

除了您伊娃(mienVarmyVar)的不同的名字,我沒有看到一個問題。一些其他的代碼必須釋放你的伊娃,或者你正在訪問它之前viewDidLoad有機會真正創建陣列(我敢打賭它是後者)。

我想你應該把代碼放在viewDidLoad中,而不是你的初始化方法。不要忘記在dealloc發佈陣列。

你可以,當然,也寫自己的myData getter方法,做延遲初始化,而不是在init()方法創建它:

- (NSMutableArray *) myData 
{ 
    if (!myData) 
     myData = [[NSMutableArray alloc] init]; 
    return myData; 
} 

需要注意的是,現在,你應該訪問self.myData如果你想使用它。

+0

我更新了我的代碼,因爲我意識到事件的流程並不清晰。所以gotInfo:方法在viewDidLoad之後運行,並且我在方法的末尾放置了一個斷點,並在myData中查看對象。然後我設置了一個需要myData的IBAction的按鈕,但是當我把斷點放在IBAction中,但是現在出現了kern失敗 –

+0

很難說,如果沒有訪問其餘的代碼,哪個其他代碼可能會失效你的陣列,對不起。 –

+0

我明白,只有一個問題。在addObject之後,即使臨時數組被釋放,myData也應該保留它? –

0

我認爲NSString的yajl_JSON類可以返回一個數組或字典 - 你可能需要檢查結果數組類型下面,因爲它可能是一個NSDictionary行:

的NSMutableArray * resultArray = [responseString yajl_JSON];

如果您將它當作一個數組處理,那麼它的字典可能會導致您的問題。

(從下面NSObject的+ YAJL類別相關的代碼)

YAJLDocument *document = [[YAJLDocument alloc] initWithData:data parserOptions:options error:error]; 
id root = [document.root retain]; 
[document release]; 
return [root autorelease]; 

(和YAJLDocument對象)

@interface YAJLDocument : NSObject <YAJLParserDelegate> { 
(id root_; // NSArray or NSDictionary 
+0

我試圖挽救'[responseString yajl_JSON]'爲NSMutableArray中和的NSMutableDictionary,但都不起作用。這樣令人沮喪的錯誤 –