我的问题有点怪异,可以说我有一个从UITableViewCell继承的类叫GenericTableViewCell,还有其他一些从GenericTableViewCell继承的类。
我希望能够将一个参数传递给GenericTableViewCell的init方法,该方法将告诉我GenericTableViewCell的哪个子类应以此TableViewCell进行初始化。
我想到的是继承人,但我知道它会失败,因为其中包含递归循环。

@implementation GenericTableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier cellIdentifier: (CellIdentifier *) identifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        if ([identifier class] == [FirstIdentifier class]){
            self = [[FirstTableViewCell alloc] initWithStyle:style reuseIdentifier:reuseIdentifier];
        }
        /// more else statements to check for other identifier cases
    }
    return self;
}

@end

有什么办法吗?还是我应该只检查init函数之外的标识符,然后决定要声明哪个单元格?

最佳答案

是的,您可以这样做。您有时会遇到一种称为类集群的模式。如果不使用ARC,则必须释放self的原始值以阻止内存泄漏。

但是,我不会这样做。我会在GenericTableViewCell中创建一个工厂方法。

+(GenericTableViewCell*) cellWithStyle: (UITableViewCellStyle)style
                       reuseIdentifier: (NSString *)reuseIdentifier
                        cellIdentifier: (CellIdentifier *) identifier
{
    GenericTableViewCell* ret = nil;

    if ([identifier class] == [FirstIdentifier class])
    {
        ret = [[FirstTableViewCell alloc] initWithStyle:style reuseIdentifier:reuseIdentifier];
    }
    else
    {
        // ....
    }
    return [ret autorelease];
}

您可以通过向CellIdentifier添加方法并在子类中覆盖它来消除if语句,如下所示:
// in CellIdentifier.m

-(id) classForCell
{
    return [GenericTableViewCell class];
}

// in FirstIdentifier.m

-(id) classForCell
{
    return [FirstTableViewCell class];
}

然后您的工厂方法变为
+(GenericTableViewCell*) cellWithStyle: (UITableViewCellStyle)style
                       reuseIdentifier: (NSString *)reuseIdentifier
                        cellIdentifier: (CellIdentifier *) identifier
{
    return [[[[identifier classForCell] alloc] initWithStyle:style
                                             reuseIdentifier:reuseIdentifier] autorelease];
}

关于objective-c - 初始化类作为子类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10716662/

10-15 15:37