【问题标题】:Cocoa -- change class of an object in app update?Cocoa - 在应用程序更新中更改对象的类?
【发布时间】:2011-05-30 10:31:36
【问题描述】:

我的存储模型中有两个 WidgetClass 类的对象。每次应用退出时都会保存它们,并在每次启动时重新加载。我想更新我的模型以使其中一个成为 WidgetSubclass 对象。 WidgetSubclass 将是 WidgetClass 的子类。

WidgetClass 有相当多的 ivars。 WidgetSubclass 将添加很少或不添加。

完成更新最有效的方法是什么?我没有使用核心数据。

【问题讨论】:

  • 如果您不使用 Core Data,您如何保存/重新加载对象?
  • encodeWithCoder/initWithCoder,在对象内部手动实现

标签: iphone datamodel


【解决方案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.
 }

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 2015-09-07
    • 2020-09-25
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多