2010-05-05 64 views
0

更新:不幸的是,下面提供的幫助並未解決我在功能間共享類屬性的問題。其他人可以提出一個可能的問題嗎?以下是最新代碼:如何在Objective-C中的多個函數中獲取和設置類屬性?

頁眉.H:

@interface FirstViewController:UIViewController <UITableViewDataSource, UITableViewDelegate, UITabBarControllerDelegate> { 
NSDictionary *sectorDictionary; 
NSInteger sectorCount; 
} 

@property (nonatomic, retain) NSDictionary *sectorDictionary; 

- (id)initWithData:(NSMutableDictionary*)inData; 

實施.M:

@synthesize sectorDictionary; 

- (id) testFunction:(NSDictionary*)dictionary { 
NSLog(@"Count #1: %d", [dictionary count]); 
return nil; 
} 

- (id)initWithData:(NSMutableDictionary *)inData { 
self = [self init]; 
if (self) { 
    [self testFunction:inData]; 
    // set the retained property 
    self.sectorDictionary = inData; 
    } 

return self; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
NSLog(@"Count #2: %d", [self.sectorDictionaryCopy count]); 
return [self.sectorDictionaryCopy count]; 
} 

控制檯輸出:

2010-05-05 20:11:13.126 JSONApp[17378:207] Count #1: 9 
2010-05-05 20:11:13.130 JSONApp[17378:207] Count #2: 0 

跟進this question有關共享類別之間的對象現在我需要弄清楚如何在課堂上的各種功能中共享這個對象。

首先,設置:在我的App Delegate中,我從JSON將菜單信息加載到NSMutableDictionary中,並通過使用名爲initWithData的函數傳遞給視圖控制器。我需要使用這個字典來填充一個新的表視圖,它具有諸如numberOfRowsInSection和cellForRowAtIndexPath之類的方法。

我想使用字典計數來返回字典中的numberOfRowsInSection和info以填充每個單元格。不幸的是,我的代碼永遠不會超越init階段,字典是空的,所以numberOfRowsInSection總是返回零。

我想我可以創建一個類屬性,合成它,然後設置它。但它似乎並不想保留物業的價值。我在這裏做錯了什麼?

在標題.H:

@interface FirstViewController:UIViewController <UITableViewDataSource, UITableViewDelegate, UITabBarControllerDelegate> { 
    NSMutableDictionary *sectorDictionary; 
    NSInteger sectorCount; 
} 

@property (nonatomic, retain) NSMutableDictionary *sectorDictionary; 

- (id)initWithData:(NSMutableDictionary*)data; 

@end 

在執行的.m:從NSLog的

@synthesize sectorDictionary; 

- (id) testFunction:(NSMutableDictionary*)dictionary { 
    NSLog(@"Count #1: %d", [dictionary count]);  
    return nil; 
} 

- (id)initWithData:(NSMutableDictionary *)data { 
    if (!(self=[super init])) { 
     return nil; 
    } 
    [self testFunction:data]; 

    // this is where I'd like to set a retained property 
    self.sectorDictionary = data; 

    return nil; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    NSLog(@"Count #2: %d", [self.sectorDictionary count]); 
    return [self.sectorDictionary count]; 
} 

輸出:

2010-05-04 23:00:06.255 JSONApp[15890:207] Count #1: 9 
2010-05-04 23:00:06.259 JSONApp[15890:207] Count #2: 0 
+1

這是一個遠射,但因爲它是一個可變的字典有機會別的東西正在改變它?如果你改變了'mutableCopy',會發生什麼? (即'sectorDictionary = [data mutableCopy];') – dreamlax 2010-05-05 06:36:04

+0

initWithData中存在一個錯字:您應該返回self,而不是nil。我確信它在你的真實代碼中,因爲否則你永遠不會看到第二條日誌消息。 – JeremyP 2010-05-05 08:33:49

+0

非常有幫助。將檢查這個,報告回來並標記爲答案,如果這是票。謝謝! – buley 2010-05-05 15:10:40

回答

0

所有的初始化函數應該返回自己。在initWithData結尾處將返回nil更改爲返回self。

-(id) initWithData:(NSMutableDictionary *)inData { 
    self = [self init]; // best practice use super for method with same name 
    if (self) { 
     self.sectorDictionary = inData; 
    } 
    return self; 
} 

sectorDictionary成員不應該是可變的。如果它改變了,你需要在表上調用reloadData。您的setter函數應該創建一個不可變的副本。

-(void) setSectorDictionary:(NSDictionary *)inData { 
    NSDictionary *old = sectorDictionary; 
    sectorDicitonary = inData ? [[NSDictionary alloc] intWithDictionary:inData] : nil; 
    [self.table reloadData]; 
    [old release]; 
} 
+0

這是一個複雜的二傳手。 ('[sectorDictionary autorelease]; sectorDictionary = [inData copy];')有什麼問題? – dreamlax 2010-05-05 07:01:45

+0

不是我正在尋找的東西,而是接近我收到的答案。 – buley 2010-05-09 18:49:55

-1

代替

self.sectorDictionary = data; 

嘗試這種方式...如果它成功完成

self.sectorDictionary = [[NSMutableDictionary alloc] init]; 
self.sectorDictionary = (NSMutableDictionary *) data; 
+0

感謝您的回答。不幸的是,這給了我與上面相同的NSLog輸出(計數#1:9;計數#2:0) – buley 2010-05-05 06:25:00

+0

鑄造是不必要的,你已經在第一行泄漏。 – dreamlax 2010-05-05 06:37:47

+0

是投在不必要的......你可以在分配前釋放它..... – 2010-05-05 07:26:19

0

我相信你的問題在於行self.sectorDictionary = data

您需要首先爲正在創建的字典分配一些內存,因此將需要一條類似 self.sectorDictionary = [[NSMutableDictionary alloc] init];的行。

你已經開始,你需要與已傳入的字典的內容來填充它的新字典後

所以......

試試行:

self.sectorDictionary = [[NSMutableDictionary alloc] initWithDictionary:data]; 

而不是:

self.sectorDictionary = data; 
+1

看看調試,'data'顯然是一個包含9個項目的集合對象,所以我很害怕你的想法不會有幫助。 – JeremyP 2010-05-05 08:31:00

+0

我現在看到他正在嘗試做什麼。你的權利,這個答案無濟於事。 – user331951 2010-05-05 23:25:06