开发者

Cocoa -- change class of an object in app update?

开发者 https://www.devze.com 2023-02-01 06:12 出处:网络
I have two objects of class WidgetClass in my stored model.They are saved each time the app exits and reloaded each time it开发者_JAVA技巧 starts.I want to update my model to make one of them a Widget

I have two objects of class WidgetClass in my stored model. They are saved each time the app exits and reloaded each time it开发者_JAVA技巧 starts. I want to update my model to make one of them a WidgetSubclass object. WidgetSubclass will be a subclass of WidgetClass.

WidgetClass has quite a lot of ivars. WidgetSubclass will add few or none.

What is the most efficient way to accomplish the update? I am not using core data.


Couple of things.

If the subclass does not add any ivars to the superclass, you can actually get away with the following:

WidgetSubclass* widget = (WidgetSubclass*)[[WidgetClass alloc]initWithCoder: someCoder];
Class object_setClass(widget, [WidgetSubclass class]);

There is some risk that changes in the runtime could break the above code. So here is a safer way:

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;
 }

Now I can have the following NSObject category method:

 -(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.
 }
0

精彩评论

暂无评论...
验证码 换一张
取 消