在这个例子中使用内省是否是正确的做法?

时间:2016-03-12 07:51:43

标签: ios objective-c cocoa-touch

在这个例子中使用内省是否是正确的做法?

我在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;
}

2 个答案:

答案 0 :(得分:4)

我看不出有任何理由不检查数据对象的类别,但您应该使用isKindOfClass:而不是isMemberOfClass:

后者检查与接收者的类完全匹配,你不会得到你所获得的数据类;他们都是class clusters。例如,您拥有的任何NSString实际上都是__NSCFString。同样适用于NSDateNSNumber

此外,您应该使用ARC。

答案 1 :(得分:2)

技术上可以(正如Josh所指出的那样改为isMemberOfClass:。)

如果这是好的风格,这是值得商榷的。相同的tableview是否真的显示了彼此相邻的那些不同类的项目?如果有多个表视图,则使用单独的方法/委托可能更合适。

另外,我认为你可以改进你的方法命名。不鼓励使用getDataSource - “get”具有非常特殊的含义且很少使用(例如,getBytes NSData上)。你也想摆脱“和”这只是噪音。

最后,今天有没有理由不改用ARC?