相同的对象但具有不同的内容(Objective-C)

时间:2017-08-04 03:59:06

标签: ios objective-c

我的方法如下:

+ (PlayListModel *)transferToPlayListModelWithModel:(HomeLooperInfoDataResponseModel *)model{

    PlayListModel * listModel = [PlayListModel new];

    listModel.isDaily = NO;
    listModel.idField = model.idField;
    listModel.title = model.title;
    listModel.url = model.url;
    listModel.type = model.type;
    listModel.pictureUrl = model.pictureUrlBig;

    listModel.price = model.price;
    listModel.discount_price = model.discount_price;
    listModel.live_count = model.live_count;
    listModel.webViewIntroURL = model.live_url;

    listModel.isCost = model.isCost;
    listModel.is_live = model.is_live;
    listModel.live_end_time = model.live_end_time;
    listModel.live_start_time = model.live_start_time;
    listModel.is_recording = model.is_recording;

    return listModel;

}

非常简单,我在这里调用它:

PlayListModel *model = [PlayListModel transferToPlayListModelWithModel:currentModel];
NSLog(@"%@",model);

而且,它显示了同一个对象model具有不同的内容: enter image description here 我希望属性isDaily不是,但它返回了一个让我很困惑的。我写了listModel.isDaily = NO。不知道哪里出了问题。

P.S。这是我的描述方法:

- (NSString *)description{
    unsigned int count;
    const char *clasName = object_getClassName(self);
    NSMutableString *string = [NSMutableString stringWithFormat:@"<%s: %p>:[ \n",clasName, self];
    Class clas = NSClassFromString([NSString stringWithCString:clasName encoding:NSUTF8StringEncoding]);
    Ivar *ivars = class_copyIvarList(clas, &count);
    for (int i = 0; i < count; i++) {
        @autoreleasepool {
            Ivar ivar = ivars[i];
            const char *name = ivar_getName(ivar);

            NSString *type = [NSString stringWithCString:ivar_getTypeEncoding(ivar) encoding:NSUTF8StringEncoding];
            NSString *key = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
            id value = [self valueForKey:key];

            if ([type isEqualToString:@"B"]) {
                value = (value == 0 ? @"NO" : @"YES");
            }
            [string appendFormat:@"\t%@: %@\n",[self delLine:key], value];
        }
    }
    [string appendFormat:@"]"];
    return string;
}

2 个答案:

答案 0 :(得分:1)

左下角的输出是正确的值。 试试这个NSLog(@"%@", model.isDaily)即可看到结果。

右下角的输出基于在当前类或父类中实现的方法-(void)description,可能在此方法中更改属性isDaily;

答案 1 :(得分:0)

问题在于-description方法的这些行:

        id value = [self valueForKey:key];

        if ([type isEqualToString:@"B"]) {
            value = (value == 0 ? @"NO" : @"YES");
        }

value永远不会等于0.对于布尔属性,它将是包装属性的标量值的NSNumber对象。键值编码始终处理对象,而不是直接处理标量。

您可以通过将代码更改为:

来解决此问题
        id value = [self valueForKey:key];

        if ([type isEqualToString:@"B"]) {
            value = [value boolValue] ? @"YES" : @"NO";
        }