我基本上实现了一个更高级的 NSURLConnection 类,它从服务器下载数据并将其解析为字典,并返回数据的 NSDictionary。我正在尝试添加一个完成块选项(除了委托选项),但是每当我尝试将该数据存储在另一个类中时它都会崩溃。
[dataFetcher_ fetchDataWithURL:testURL completionHandler:^(NSDictionary *data, NSInteger error) {
contentDictionary_ = data;
}];
我可以很好地 NSLog 那些数据,基本上可以用它做任何我想做的事情,但是一旦我尝试将它保存到另一个变量中,它就会崩溃并显示一条非常模糊的消息。
编辑:崩溃消息是 EXC_BAD_ACCESS,但堆栈跟踪是 0x00000000 错误:地址不包含指向目标文件中某个部分的部分。
我在单例的 init 方法中调用这个函数。如果我在完成块中设置它,它确实让我保存数据。
[SingletonClass sharedInstance].contentDictionary = data
但是随后应用程序永远卡住了,因为 sharedInstance 还没有返回,所以单例对象仍然是 nil,所以完成块中的 sharedInstance 再次调用 init,一遍又一遍。
编辑 2: 单例代码如下所示:
+ (SingletonClass*)sharedInstance {
static SingletonClass *instance;
if (!instance) {
instance = [[SingletonClass alloc] init];
}
return instance;
}
- (id)init {
self = [super init];
if (self) {
dataFetcher_ = [[DataFetcher alloc] init];
NSString *testURL = @"..."
[dataFetcher_ fetchDataWithURL:testURL completionHandler:^(NSDictionary *data, NSInteger error) {
[SingletonClass sharedInstance].contentDictionary = data;
}];
}
return self;
}
就像我说的那样,这很好用,但会一遍又一遍地重复初始化代码,直到应用程序崩溃。这只发生在我第一次在设备上运行应用程序时,因为我缓存了返回的数据,并且一旦我缓存了数据,它就不会崩溃。我希望能够只说 self.contentDictionary = data,但这会崩溃。