在这个例子中使用内省是否是正确的做法?
我在UITableView
数据源方法tableView:cellForRowAtIndexPath:
中,并且我正在检查数据源对象的类型,以便确定哪个UITableViewCell
子类使用。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
....
id object = [[self getDataSource:tableView] objectAtIndex:[indexPath section]];
if ( [object isKindOfClass:[NSString class]] ||
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
} else if ([object isMemberOfClass:[NSNumber class]]) {
cell = [[[CMAutocompleteTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier andAutocompleteTextField:object] autorelease];
} else if ([object isMemberOfClass:[NSDate class]]) {
cell = [[[CMDateTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier andTextView:object] autorelease];
} else {
cell = [[[CMAutocompleteTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier andAutocompleteTextField:field] autorelease];
}
return cell;
}
答案 0 :(得分:4)
我看不出有任何理由不检查数据对象的类别,但您应该使用isKindOfClass:
而不是isMemberOfClass:
。
后者检查与接收者的类完全匹配,你不会得到你所获得的数据类;他们都是class clusters。例如,您拥有的任何NSString
实际上都是__NSCFString
。同样适用于NSDate
和NSNumber
。
此外,您应该使用ARC。
答案 1 :(得分:2)
技术上可以(正如Josh所指出的那样改为isMemberOfClass:
。)
如果这是好的风格,这是值得商榷的。相同的tableview是否真的显示了彼此相邻的那些不同类的项目?如果有多个表视图,则使用单独的方法/委托可能更合适。
另外,我认为你可以改进你的方法命名。不鼓励使用getDataSource
- “get”具有非常特殊的含义且很少使用(例如,getBytes
NSData
上)。你也想摆脱“和”这只是噪音。
最后,今天有没有理由不改用ARC?