我正在使用带有 ARC 的 Xcode 4.5 创建一个 UITableViewController 类,我想用一个 NSDictionary 对其进行初始化。在其初始化程序中,创建的 [resourcesAsDictionary 计数] 返回了一些正确的值,但稍后当我在主视图中按下按钮时,表格是根据 NSDictionary 的条目数构建的,我用 NSDictionary 初始化了类始终为空并且 [resourcesAsDictionary count] 返回 0。我认为这与 ARC 有关吗?如果我将其关闭,我可以保留该变量吗?但是必须有一种方法可以使用 ARC 来获得这个?)相关代码:
编辑:我已经根据收到的帮助更改了代码。
编辑2:因为我能够缩小问题的范围,这有点令人困惑,而且阅读量很大,我创建了一个新主题:ViewController 类在创建视图时创建新实例,但它应该使用现有的一个
编辑 3:问题在已经链接的线程中解决了,这个也是。
视图控制器.h:
#import <UIKit/UIKit.h>
#import <Foundation/NSJSONSerialization.h>
#import <Foundation/NSXMLParser.h>
#import "ResourcesTableViewController.h"
@interface ViewController : UIViewController <UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource> {
// Note: this <UITableViewDelegate, UITableViewDataSource> is NOT related to the TableViewController. My ViewController has another TableView.
NSDictionary *parsedResponseAsDictionary;
ResourcesTableViewController *resourceTableViewController;
...
}
...
ViewController.m 中的某处:
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
parsedResponseAsDictionary = [[NSDictionary alloc] init];
}
...
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)_bodyData {
parsedResponseAsDictionary = [NSJSONSerialization JSONObjectWithData:bodyData options:NSJSONWritingPrettyPrinted error:&err];
... // putting found keys as entries in an array foundResources
if ([foundResources count] > 0) {
resourceTableViewController = [[ResourcesTableViewController alloc] initWithStyle:UITableViewStylePlain];
[resourceTableViewController setResourcesAsDictionary:parsedResponseAsDictionary];
NSLog(@"Delivered %i entries.",[[resourceTableViewController resourcesAsDictionary] count]);
// TableView can be built: enable "Show Resources" button
[_showResourcesButton setAlpha:1];
[_showResourcesButton setEnabled:YES];
}
}
...
// Output:
// REST Analyzer[1259:c07] Delivered 8 entries.
// REST Analyzer[1259:c07] viewWillAppear: (null)
// REST Analyzer[1259:c07] Now: 0 entries.
资源表视图控制器.h:
#import <UIKit/UIKit.h>
@interface ResourcesTableViewController : UITableViewController {
}
@property (nonatomic, strong) NSDictionary *resourcesAsDictionary;
@end
资源表视图控制器.m:
#import "ResourcesTableViewController.h"
@implementation ResourcesTableViewController
// - (id)initWithDictionary:(NSDictionary*)dic {
// if (self = [super init])
// resourcesAsDictionary = [[NSDictionary alloc] initWithDictionary:dic];
// NSLog(@"resource table created with %i entries.",[resourcesAsDictionary count]);
// return self;
// }
- (void)viewWillAppear:(BOOL)animated {
NSLog(@"viewWillAppear: %@", self.resourcesAsDictionary);
// (null) is returned here.
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSLog(@"Now: %i entries.",[self.resourcesAsDictionary count]);
return [self.resourcesAsDictionary count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2
reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = @"Cell";
cell.detailTextLabel.text = @"Description";
return cell;
}