NSInvalidArgumentException NSDictionary计数

时间:2014-02-21 21:56:39

标签: iphone objective-c json nsdictionary categories

我写了一个NSDictionary类别。 Category有一个方法调用“initWithJSONURL”。 代码如下:

- (id)initWithJSONURL:(NSURL *)url
{
self = [super init];

if (self) {
    NSError *error;

    NSData *data = [NSData dataWithContentsOfURL:url
                                         options:NSUTF8StringEncoding
                                           error:&error];

    if (!data) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"connection failed"
                                                        message:[error localizedDescription]
                                                       delegate:self
                                              cancelButtonTitle:@"cancel"
                                              otherButtonTitles:nil];
        [alert show];
    } else {
        self = [NSJSONSerialization JSONObjectWithData:data
                                               options:0
                                                 error:&error];

        if (error) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"invalid data"
                                                            message:[error localizedDescription]
                                                           delegate:self
                                                  cancelButtonTitle:@"cancel"
                                                  otherButtonTitles:nil];
            [alert show];
        }

    }

}

return self;
}

这里是我的ViewController viewDidLoad

中的代码
NSURL *url = [NSURL URLWithString:@"http://localhost:8888/json.php"];
NSDictionary *dict = [[NSDictionary alloc] initWithJSONURL:url];
NSLog(@"%@", dict);

如果我使用正确的网址,一切都很完美。 但如果URL不正确,应用程序崩溃。 我不知道为什么,它不应该崩溃,它应该显示警报视图。 游戏机显示:

erminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSDictionary count]: method sent to an uninitialized immutable dictionary object'

我希望有人可以帮助我,并为我糟糕的英语道歉。

1 个答案:

答案 0 :(得分:3)

您想拨打[self init]而不是[super init]。类别不是子类,因此[super init]表示[NSObject init]。永远不会调用NSDictionary的指定初始化程序,并且内部字典结构保持单一化。