Se la classe tableview fornisce QUALSIASI storage questo si interromperà. Non consiglierei il percorso che stai percorrendo. Ma il metodo corretto sarebbe utilizzare object_setClass(tableView, [MyTableView class])
.
Assicurati che questo sia proprio quello che desideri.
Ecco un piccolo esempio di codice che mostra come questa sia un'idea orribile.
#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);
}
e l'uscita
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
Come si può vedere la scrittura per storage->c
ha scritto al di fuori della memoria allocata per l'istanza, e nel blocco ho assegnato per casuale. Se quello era un altro oggetto, hai appena distrutto il puntatore isa
.
fonte
2011-12-14 22:45:47
Cool grazie. Ma è sicuro impostare 'self.tableView' in' UITableViewController' in una nuova istanza di una sottoclasse personalizzata di 'UITableView'? – ma11hew28
dire @JoshuaWeinberg, sai se sarà male usare [Riferimenti associativi] (http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocAssociativeReferences.html) So che è sicuro usare le categorie (l'ho usato diverse volte) ma se la sottoclasse ha bisogno di un'altra variabile, penso che questo farà il trucco ... –
Li uso sempre, molto utile. –