49

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];
Piper
  • 1,266
  • 3
  • 15
  • 26
aryaxt
  • 76,198
  • 92
  • 293
  • 442

2 Answers2

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];
BoltClock
  • 700,868
  • 160
  • 1,392
  • 1,356
SegFault
  • 954
  • 7
  • 5
  • 4
    my main question is: "so based on this init method how do u instantiate an object of this class?" – aryaxt Oct 15 '10 at 15:59
  • These methods need to be defined if you are using the object for serializing and deserializing. You can initialize the object using normal init method – SegFault Oct 15 '10 at 16:02
  • But... how do you invoke the initWithCoder method? – Ev. Feb 17 '15 at 23:12
  • 1
    I think you are referring to [NSKeyedUnarchiver unarchiveObjectWithData:<#(NSData *)#>]. Check the class methods of NSKeyedUnarchiver for reading data – Bogdan Apr 20 '15 at 22:38
  • @Ev You don't call initWithCoder, this method gets called as the result of loading a view from nib or storyboard. – aryaxt Apr 20 '15 at 22:53
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

Jack
  • 131,802
  • 30
  • 241
  • 343