Objective C - How do I use initWithCoder method?
Asked Answered
S

2

50

I have the following method for my class which intends to load a nib file and instantiate the object:

- (id)initWithCoder:(NSCoder*)aDecoder 
{
    if(self = [super initWithCoder:aDecoder]) {
        // Do something
    }
    return self;
}

How does one instantiate an object of this class? What is this NSCoder? How can I create it?

    MyClass *class = [[MyClass alloc] initWithCoder:aCoder];
Soulier answered 15/10, 2010 at 15:41 Comment(0)
Z
42

You also need to define the following method as follows:

- (void)encodeWithCoder:(NSCoder *)enCoder {
    [super encodeWithCoder:enCoder];

    [enCoder encodeObject:instanceVariable forKey:INSTANCEVARIABLE_KEY];

    // Similarly for the other instance variables.
    ....
}

And in the initWithCoder method initialize as follows:

- (id)initWithCoder:(NSCoder *)aDecoder {

   if(self = [super initWithCoder:aDecoder]) {
       self.instanceVariable = [aDecoder decodeObjectForKey:INSTANCEVARIABLE_KEY];

       // similarly for other instance variables
       ....
   }

   return self;
}

You can initialize the object standard way i.e

CustomObject *customObject = [[CustomObject alloc] init];
Zoltai answered 15/10, 2010 at 15:57 Comment(5)
my main question is: "so based on this init method how do u instantiate an object of this class?"Soulier
These methods need to be defined if you are using the object for serializing and deserializing. You can initialize the object using normal init methodZoltai
But... how do you invoke the initWithCoder method?Copybook
I think you are referring to [NSKeyedUnarchiver unarchiveObjectWithData:<#(NSData *)#>]. Check the class methods of NSKeyedUnarchiver for reading dataJannette
@Ev You don't call initWithCoder, this method gets called as the result of loading a view from nib or storyboard.Soulier
G
18

The NSCoder class is used to archive/unarchive (marshal/unmarshal, serialize/deserialize) of objects.

This is a method to write objects on streams (like files, sockets) and being able to retrieve them later or in a different place.

I would suggest you to read http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/Archiving/Archiving.html

Gipon answered 15/10, 2010 at 15:47 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.