Search code examples
iosxcodeinitializationblockinitializing

Initializing an object inside a block


I'm trying to initialize a dict variable but I don't understand why one way works, while the other does not.

In case 1 everything is alright and I can use dict later.
In case 2 it will be released very soon (It will becomes a zombie) and If I try to use it later (outside a block) the program crashes.

Here's some code from my class (c++ mixed with objective-c) written for ios.
Inside the block i tried to initialize variable dict in two different ways.

class Data
{
public:
    NSMutableDictionary *dict;

    void DoSomeStuff()
    {
    [NSSomeFrameworkTool doSomeStuffWithCompletionHandler:^(NSError *err) {
        // case 1 - OK
        dict = [[NSMutableDictionary alloc] initWithDictionary:[NSKeyedUnarchiver unarchiveObjectWithFile:@"dict.dat"]];

        // case 2 - will crash later if i try to use dict
        dict = [NSKeyedUnarchiver unarchiveObjectWithFile:@"dict.dat"];   }];
    }
}

This class has class variable dict, which is initialized in the DoSomeStuff() method.
That method calls a method from the ios framework that uses block (as a callback) to inform me that some task is done.

I was wondering why case 1 and case 2 work different. Maybe it is forbidden to use references outside the block, that was initialized inside this block?
What's wrong with doing this the way shown in case2?


Solution

  • In first case you don't release your dict, and in second case it is autoreleased so you should retain it.

    dict = [[NSKeyedUnarchiver unarchiveObjectWithFile:@"dict.dat"] retain];