来自NSOpenPanel的beginWithCompletionHandler块

时间:2011-06-21 20:09:58

标签: macos cocoa objective-c-blocks

我正在使用NSOpenPanel类的beginWithCompletionHandler。我的问题是projects属性是该块内的无效对象。我错过了什么?

 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,项目指向正确的Project实例。

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

if if is the state

之后

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

1 个答案:

答案 0 :(得分:1)

确切的错误信息是什么?出了什么问题?

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

pself.project都将是同一个对象(除非你在其他地方做了一些事情,要在project被分配的时间和那个块之间重新分配p跑了。

请注意,您还泄漏了被称为spriteaImage的对象。