NSClassFromString 行为不当和缓存 class
NSClassFromString misbehaving and caching class
我有一个 class X
和几个 classes X1,X2,X3,X4
是 X
的后代
我有一个名为 class 的 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
return class X1
我是不是漏掉了什么?
我发现了错误,我发帖在这里只是为了完成。
在 class X
中,我声明 shared
为
+ (instancetype)shared {
static id _shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_shared = [self new];
});
return _shared;
}
而且我没有在 child class 中实施 shared
。
将 shared
添加到 child class 中解决了问题。它 returns 总是第一个 class 实例化的原因很明显,但我没有看到。
我有一个 class X
和几个 classes X1,X2,X3,X4
是 X
我有一个名为 class 的 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
return class X1
我是不是漏掉了什么?
我发现了错误,我发帖在这里只是为了完成。
在 class X
中,我声明 shared
为
+ (instancetype)shared {
static id _shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_shared = [self new];
});
return _shared;
}
而且我没有在 child class 中实施 shared
。
将 shared
添加到 child class 中解决了问题。它 returns 总是第一个 class 实例化的原因很明显,但我没有看到。