我的问题有点怪异,可以说我有一个从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/