我的存储模型中有两个类WidgetClass对象。每次应用程序退出时都会保存它们,并在每次启动时重新加载。我想更新我的模型,使其中一个成为WidgetSubclass对象。 WidgetSubclass将是WidgetClass的子类。
WidgetClass有很多ivars。 WidgetSubclass将添加很少或没有。
完成更新的最有效方法是什么?我没有使用核心数据。
答案 0 :(得分:1)
一些事情。
如果子类没有向超类添加任何ivars,您实际上可以使用以下内容:
WidgetSubclass* widget = (WidgetSubclass*)[[WidgetClass alloc]initWithCoder: someCoder];
Class object_setClass(widget, [WidgetSubclass class]);
运行时的更改可能会破坏上述代码。所以这是一种更安全的方式:
Foo.m:
-(void) copyIvarsTo: (Foo*) foo {
[super copyIvarsTo: foo];
foo.ivar1 = [self.objectIvar1 copy];
foo.ivar2 = [self.objectIvar2 copy];
foo.floatIvar = self.floatIvar;
// etc. Method works fine if foo is actually a member of a subclass.
}
-(Foo*) copy {
Foo* clone = [[self class]alloc];
[self copyIvarsTo: clone];
return clone;
}
现在我可以使用以下NSObject类别方法:
-(NSObject*) wj_copyWithSubclass: (Class) subclass {
if (![self respondsToSelector: @selector(copyIvarsTo:)])
return nil;
NSAssert([subclass isSubclassOfClass: [self class]], @"call copyWithSubclass only on subclasses");
NSObject* clone = [subclass alloc];
[self copyIvarsTo: clone];
return clone; // at this point, clone has copied all the ivars that are members of the receiver's class. Other ivars have their default values. Calling code needs to handle that.
}