Блоки для beginWithCompletionHandler из NSOpenPanel

Я использую beginWithCompletionHandler класса NSOpenPanel. Моя проблема в том, что атрибут проектов является недопустимым объектом внутри этого блока. Что мне не хватает?

 NSOpenPanel *panel = [NSOpenPanel openPanel];
    [panel setCanChooseDirectories:NO];
    [panel setAllowedFileTypes:[NSImage imageFileTypes]];

    [panel  beginWithCompletionHandler:^(NSInteger result)
    {
        if (result==NSFileHandlingPanelOKButton)
        {
            NSString *name = [panel.URL lastPathComponent];

            NSImage *aImage = [[NSImage alloc] initWithContentsOfURL:panel.URL];

            if (aImage)
            {
                DLog(@"Success: %@", name);
                Sprite *sprite = [[Sprite alloc] init];
                [self.project addSprite:sprite];
            }
            else
            {
                DLog(@"Error, i can't load image %@ at path %@", name, [panel.URL path]);
            }
        }

    }];

Объясняю свою проблему скриншотами отладчика

Перед блоком

http://img233.imageshack.us/img233/8982/schermata062455735alle1.png >

На данный момент все правильно, self = SpriteAnimation, проект указывает на правильный экземпляр проекта.

http://img838.imageshack.us/img838/8982/schermata062455735alle1.png >

После того, как это состояние

http://img855.imageshack.us/img855/8982/schermata062455735alle1.png >


person Luca Bartoletti    schedule 21.06.2011    source источник
comment
Что вы имеете в виду под недопустимым объектом? Объект, который был освобожден? Какие сообщения об ошибках вы получаете?   -  person    schedule 22.06.2011
comment
Привет, сообщений об ошибках нет, проблема в том, что если я поставлю точку останова в строке [panel setAllowedFileTypes:[NSImage imageFileTypes]]; projects, укажите в ‹Project: 0x10051c530›. С точкой останова в строке [self.project addSprite:sprite]; я увидел, что проект 0xc01c0000 does not appear to point to a valid object.   -  person Luca Bartoletti    schedule 22.06.2011
comment
Есть ли шанс, что self.projects изменится после того, как вы покажете панель, но до ее закрытия?   -  person    schedule 22.06.2011
comment
Нет. Это мое первое использование блока, но если я повторю тот же шаг без выхода, то программный проект будет тем же объектом по тому же адресу до if.   -  person Luca Bartoletti    schedule 22.06.2011
comment
Я просто добавил изображение, чтобы лучше объяснить мою проблему.   -  person Luca Bartoletti    schedule 22.06.2011
comment
В этот момент отладчик показывает self как экземпляр NSOpenPanel, потому что NSOpenPanel вызывает ваш блок обработчика завершения. Однако это не означает, что self.project не относится к экземпляру NSOpenPanel. Вы пробовали NSLog(@"%@", self.project); внутри своего блока?   -  person    schedule 22.06.2011
comment
Да, я пробую печатать объект в проекте. На втором изображении я вижу правильный объект ‹Project: 0x10051c530›, на третьем изображении вижу, что проект 0xc01c0000 не указывает на действительный объект.   -  person Luca Bartoletti    schedule 22.06.2011
comment
@bavarious вторые изображения показывают, что self - это SpriteAnimation, это внутри блока. Третий экран, все еще внутри блока, показывает, что self является экземпляром NSOpenPanel. Я этого не понимаю.   -  person Luca Bartoletti    schedule 22.06.2011


Ответы (1)


Какое точное сообщение об ошибке и что происходит не так?

            [self.project addSprite:sprite];
            [p addSprite:sprite];

И p, и self.project будут одним и тем же объектом (если вы не сделали что-то еще, чтобы переназначить project между временем, когда p был назначен и этот блок был запущен.

Обратите внимание, что вы также пропускаете объекты, указанные как sprite и aImage.

person bbum    schedule 21.06.2011
comment
Привет, я только что удалил p, потому что это был всего лишь тест. Моя проблема в том, что атрибут проектов является недопустимым объектом внутри этого блока, а не до того, как блок станет допустимым пригодным для использования объектом. Я использую Xcode 4.2 с включенным ARC, поэтому я не пропускаю спрайт и объект aImage. - person Luca Bartoletti; 22.06.2011
comment
Я просто добавил изображение, чтобы лучше объяснить мою проблему. - person Luca Bartoletti; 22.06.2011
comment
Спасибо за разъяснения. - person bbum; 22.06.2011