我想我缺少有关Objective-C编程的一些基本知识。

调用堆栈如下:
MyViewController调用一个块以建立对我的服务器的请求。

[_myClient storePhoto:photo withCompletion: ^(KNPhotoInfo *retPhoto, NSError *error) { // do stuff }];


该调用向我的服务器提出了一个保存照片的请求,然后尝试处理响应:

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    if(error) //handle it
    @try
    {
        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        KNPhotoInfo *photoInfo = [[KNPhotoInfo alloc] initWithPhotoDictionary:json[@"data"]];

        [_storage setObject:[photoInfo toDictionary] forKey:PhotoInfoKey];

        completionHandler(photoInfo, nil);
    }
    @catch (NSException *exception)
    {
        NSLog(@"Error parsing user info: %@", exception);
    }

}];


但是,如果我在调用photoInfo变量的init函数之前对其进行检查,则可以在其中看到一些数据(不仅仅是垃圾)。如果我进入init函数,则在分配了某些内容后,我可以看到自己的对象闪烁,但是它再次显示“ 0个对象”。初始化函数的调用返回后,一切似乎都很好,我可以看到具有json [“ data”]初始化的所有属性的对象,但是一旦我再次执行photoInfo再次说“ 0 objects”。

有人可以帮我从这里出去吗?我认为这与调用类的“自身”与对象初始化的位置的自身有关,但我感到困惑。 :s

编辑:添加更多的上下文。初始化函数如下所示:

- (instancetype) initWithPhotoDictionary:(NSDictionary *)dict{
    self = [super init];

    self.url                = dict[@"photo"][@"url"];
    self.challenge          = dict[@"photo"][@"challenge"];
    self.user               = dict[@"photo"][@"user"];
    self.pubDate            = dict[@"photo"][@"pub_date"];

    return self;
}


但是,在此调用中进行调试时,self没有子级(即使它显然具有子级),并且只说“ 0个对象”。令人沮丧的是,当

[_storage setObject:[photoInfo toDictionary] forKey:PhotoInfoKey];


碰巧我收到有关空值的投诉。但是,如果我对photoInfo进行“打印描述”,则可以看到我的所有字段,并且正确填写。

最佳答案

使用这种方法

- (KNPhotoInfo) initWithPhotoDictionary:(NSDictionary *)dict
{
 KNPhotoInfo *photoInfo = [[KNPhotoInfo alloc] init

    photoinfo.url                = dict[@"photo"][@"url"];
    photoinfo.challenge          = dict[@"photo"][@"challenge"];
    photoinfo.user               = dict[@"photo"][@"user"];
    photoinfo.pubDate            = dict[@"photo"][@"pub_date"];

    return photoInfo;
}

09-25 18:23