我试图回答将 UITableView 子类与 UITableViewController 一起使用 https://stackoverflow.com/questions/874906/using-a-uitableview-subclass-with-a-uitableviewcontroller with ISA 交换 https://stackoverflow.com/a/679866/242933像这样:
self.tableView->isa = [MyTableView class];
但是,我收到编译错误:Instance variable 'isa' is protected.
有办法解决这个问题吗?如果是这样,这样做安全吗?
我问是因为@AmberStar 对这个问题的回答 https://stackoverflow.com/a/874989/242933似乎略有缺陷。 (请参阅我的评论。)
如果您的表视图类提供任何存储,这将会中断。我不会推荐你要走的路。但正确的方法是使用object_setClass(tableView, [MyTableView class])
.
请确保这确实是您想要的。
这是一个小代码示例,展示了这是一个多么糟糕的想法。
#import <objc/runtime.h>
@interface BaseClass : NSObject
{
int a;
int b;
}
@end
@implementation BaseClass
@end
@interface PlainSubclass : BaseClass
@end
@implementation PlainSubclass
@end
@interface StorageSubclass : BaseClass
{
@public
int c;
}
@end
@implementation StorageSubclass
@end
int main(int argc, char *argv[])
{
BaseClass *base = [[BaseClass alloc] init];
int * random = (int*)malloc(sizeof(int));
NSLog(@"%@", base);
object_setClass(base, [PlainSubclass class]);
NSLog(@"%@", base);
object_setClass(base, [StorageSubclass class]);
NSLog(@"%@", base);
StorageSubclass *storage = (id)base;
storage->c = 0xDEADBEEF;
NSLog(@"%X == %X", storage->c, *random);
}
和输出
2011-12-14 16:52:54.886 Test[55081:707] <BaseClass: 0x100114140>
2011-12-14 16:52:54.889 Test[55081:707] <PlainSubclass: 0x100114140>
2011-12-14 16:52:54.890 Test[55081:707] <StorageSubclass: 0x100114140>
2011-12-14 16:52:54.890 Test[55081:707] DEADBEEF == DEADBEEF
正如你所看到的写入storage->c
写入为实例分配的内存之外,并写入我为随机分配的块中。如果那是另一个物体,你就摧毁了它isa
指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)