如何在Objective-C中跨多个函数获取和设置类属性?

时间:2010-05-05 06:09:52

标签: iphone 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和字典中的信息来填充每个单元格。不幸的是,我的代码永远不会超出init阶段,字典是空的,所以numberOfRowsInSection总是返回零。

我以为我可以创建一个类属性,合成它然后设置它。但它似乎并不想保留房产的价值。我在这做错了什么?

标题.h:

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

@property (nonatomic, retain)  NSMutableDictionary *sectorDictionary;

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

@end

在实现中.m:

@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];
}

NSLog的输出:

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

3 个答案:

答案 0 :(得分:0)

如果成功完成,任何init函数都应返回self。更改返回nil以在initWithData结束时返回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];
}

答案 1 :(得分:0)

我相信你的问题在self.sectorDictionary = data行。

你需要首先为你正在创建的字典分配一些内存,所以像这样的行 self.sectorDictionary = [[NSMutableDictionary alloc] init];将是必要的。

启动新词典后,您需要使用传入的词典内容填充它。

因此...

试一试:

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

而不是:

self.sectorDictionary = data;

答案 2 :(得分:-1)

而不是

 self.sectorDictionary = data;

试试这个......

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