NSClassFromString行为不端和缓存类

时间:2015-02-03 15:41:22

标签: ios objective-c cocoa objective-c-runtime

我有一个班级X和几个班级X1,X2,X3,X4,他们是X

的后代

我有一个NSArray的类名,我正在用它来迭代:

_classnames = @[@"X1",@"X2",@"X3",@"X4"];

然后:

- (UITableViewCell *)tableView:(UITableView *)tableView 
                                   cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString * identifier = @"cellId";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier 
                                   forIndexPath:indexPath];
    if (!cell) {
       cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                    reuseIdentifier:identifier];
    }

    X * xshared = [NSClassFromString(_classnames[indexPath.row]) shared];
    cell.textLabel.text = [xshared title];
    return cell;
}

修改: 有趣的是:

for (NSString * s in _classnames) {
    NSLog(@"%@",NSClassFromString(s));
}

tableView电话

之外工作

然后所有NSClassFromString都会返回班级X1

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

我发现了错误,我只是为了完成而在这里发帖。

在课程X中,我宣称shared

+ (instancetype)shared {
    static id _shared = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _shared = [self new];
    });

    return _shared;
}

我没有在子类中实现shared

向子类添加shared解决了这个问题。它返回的原因总是第一个实例化的类是非常明显的,但我没有看到。