2011-11-12 51 views
1

當前正在開發我的第一本Native iPhone應用程序,應用程序將集成到現有的.net應用程序中,並將使用web服務。然而我面對的問題我相信只不過是我對xcode的理解。iPhone Xcode數組列表可訪問

我希望我能解釋這個...

我的第一個觀點中確定,viewDidLoad中內我走下車來的web服務,並返回我的產品清單(這些填充的tableview)這工作完全正常:

---片斷---

- (void)viewDidLoad { 
//GET ALL ITEMS 
    myArray = [[NSMutableArray alloc] init];  
    MyWebService *webService = [[MyWebService alloc] init]; 
    myArray = [webService getAllNewsFunction]; 
    [super viewDidLoad]; 

} 

---片斷---

好了,所以我現在有我的tableview填充並等待你來選擇項目(在這種情況下,新聞文章)我需要確定selectedItem爲了填充下一個視圖與文章的細節。但是,看起來在didSelectRowAtIndexPath方法中,我的數組列表不再可訪問。我在這一點上,由於如果我簡單地創建當前視圖中我的viewDidLoad內的項目列表,而無需使用我的web服務,例如很困惑:

---片斷---

// listOfItems = [[NSMutableArray alloc] init]; 
// [myArray addObject:@"Iceland"]; 
// [listOfItems addObject:@"Greenland"]; 
// [listOfItems addObject:@"Switzerland"]; 
// [listOfItems addObject:@"Norway"]; 
// [listOfItems addObject:@"New Zealand"]; 
// [listOfItems addObject:@"Greece"]; 
// [listOfItems addObject:@"Italy"]; 
// [listOfItems addObject:@"Ireland"]; 

- - 片段---

上述內容可以在didSelectRowAtIndexPath中訪問,我可以填充detailview。

你能幫我指出我面臨的問題以及如何解決這個問題。我知道我已經給你非常基礎,所以如果我需要提供更多的信息,我很樂意這樣做。

- update -

好的基於您的回覆我已更新以下內容。

我現在已經宣佈myArray的作爲屬性

@property (nonatomic, retain) NSMutableArray *myArray; 

,並還更新了行:

self.myArray = [webService getAllNewsFunction]; 

- 更新 -

但是現在我收到一個錯誤「計劃接收到的信號:self.myArray線上的「SIGABRT」。

什麼想法?

再次感謝

回答

2

如果你正在跟蹤的命名規則,則該方法[webService getAllNewsFunction]將返回一個autoreleased數組。因此,當你再次訪問它時,它很可能已經被釋放。

如果你已經使用了一個@property聲明myArray(你應該保存自己從這些問題),那麼你可以通過做解決此問題:

self.myArray = [webService getAllNewsFunction]; 

這條線:

myArray = [[NSMutableArray alloc] init]; 

是也是superflous和造成內存泄漏,因爲您正在重新分配myArray[webService getAllNewsFunction]的值後立即沒有釋放新的NSMutableArray您alloc/init'd

UPDATE

所以從閱讀您的更新,我認爲你需要先看看警告你的項目現在有這可能會讀到類似:

屬性「myarray的」需要方法「 setMyArray」被定義 - 使用@synthesize,@dynamic或提供...

下一個線索的問題出現在控制檯的方法實現我得到這樣的事情

- [TestAppDelegate setMyArray:]:無法識別的選擇發送到實例...

那麼,這一切都歸結到是你要麼需要提供方法

- (NSMutableArray *)myArray; 
- (void)setMyArray:(NSMutableArray *)myArray; 

或讓編譯器通過添加一條@synthesize這樣的語句來爲你做這件事

.m 
@implementation YourClass 

@synthesize myArray; 

// The rest of your class methods 

- (void)dealloc 
{ 
    // release other ivars 
    [myArray release]; 
    [super dealloc]; 
} 

合成是更簡單,更快捷的選項,編譯器將根據您在@property聲明中使用哪些選項來安排合併內存管理。

+0

現在有一些小問題,我已經實施了更改。你能看見上面嗎? – NiPsTeR

+0

非常有幫助!謝謝。 – NiPsTeR