Objective c ARC目标C:如何解除自我分配?

Objective c ARC目标C:如何解除自我分配?,objective-c,cocoa,automatic-ref-counting,memory-management,Objective C,Cocoa,Automatic Ref Counting,Memory Management,我正在创建一个工作流程来浏览网站,工作流程的每一步都必须加载n帧,然后知道它准备好了,我必须执行超时 我不明白为什么[self next]会给我这个错误: *-[WebWorkflow next]:消息已发送到解除分配的实例0x105796ef0 考虑到这一委托职能: - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame { frameCounter++; NSInteger frame

我正在创建一个工作流程来浏览网站,工作流程的每一步都必须加载n帧,然后知道它准备好了,我必须执行超时

我不明白为什么[self next]会给我这个错误: *-[WebWorkflow next]:消息已发送到解除分配的实例0x105796ef0

考虑到这一委托职能:

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame {
    frameCounter++;
    NSInteger frames = [(WebWorkflowStep *)[steps objectAtIndex:index] frames];
    NSLog(@"Frame counter %ld of %ld", frameCounter, frames);
    [self next];
}
下一种方法是:

-(void) next
{
    if ( index < [steps count])
    {
        frameCounter = 0;
        index = index + 1;
        WebWorkflowStep *step = [steps objectAtIndex:index-1];
        NSDictionary *userInfo = [NSDictionary dictionaryWithObject:step forKey:@"selector"];
        [[NSNotificationCenter defaultCenter] postNotificationName:EVENT_WORKFLOW_NEXT object:nil userInfo:userInfo];

    }
}
它被初始化为:

-(id)initWithWebView:(WebView *)webview
{
    self = [ super init];
    if(self) {
        timeout = 10;
        index = 0;
        web = webview;
        frameCounter = 0;
        [web setFrameLoadDelegate:self];
    }
    return self;
}

AController实例拥有一个web视图,并且是该web视图的委托。AController实例出于某种原因被发布……我们需要看看它的所有者是如何管理它的。由于它可能会在加载过程中释放,因此应按如下方式进行清理:

- (void)dealloc {
    [web stopLoading:self];  // or webView, not sure what you call it
}
这将防止撞车。它还将放弃负载。如果您不想这样做,您需要弄清楚为什么要发布AController实例


执行此操作的第一步是dealloc方法中的断点。

AController实例拥有一个web视图,并且是web视图的委托。AController实例出于某种原因被发布……我们需要看看它的所有者是如何管理它的。由于它可能会在加载过程中释放,因此应按如下方式进行清理:

- (void)dealloc {
    [web stopLoading:self];  // or webView, not sure what you call it
}
这将防止撞车。它还将放弃负载。如果您不想这样做,您需要弄清楚为什么要发布AController实例


这样做的第一步是在dealoc方法中设置一个断点。

我确信这很难实现,但并非不可能。您确定拥有的对象本身仍然存在吗?这个问题最重要的代码在您的注释中。请发布创建/绑定web视图的代码。@danh,我更新了问题,谢谢!添加创建工作流并将其设置为委派的代码可能会有所帮助。此外,委托属性是assign或weak right?控制器是WebView委托吗?我确信这很难实现,但并非不可能。您确定拥有的对象本身仍然存在吗?这个问题最重要的代码在您的注释中。请发布创建/绑定web视图的代码。@danh,我更新了问题,谢谢!添加创建工作流并将其设置为委派的代码可能会有所帮助。此外,委托属性是assign或weak right?控制器是WebView委托吗?我最终解决了它。这门课有3个以上级别的组件。最上面的一个被取消分配,其余的在级联中取消分配。我通过调试解决了这个问题,并在每个类中放置一个dealloc,直到找到根。ARC真的是件好事吗?非常感谢@夏维克洛默:是的。ARC使得创建内存管理错误变得更加困难,修复它们也更加容易。很高兴你解决了它。ARC是一个很大的帮助,但我认为在做了一些没有它的项目之后,它更有价值,这迫使学习objective-c内存管理。如果你明白它为你做了什么,ARC真的是一件好事。我终于解决了它。这门课有3个以上级别的组件。最上面的一个被取消分配,其余的在级联中取消分配。我通过调试解决了这个问题,并在每个类中放置一个dealloc,直到找到根。ARC真的是件好事吗?非常感谢@夏维克洛默:是的。ARC使得创建内存管理错误变得更加困难,修复它们也更加容易。很高兴你解决了它。ARC是一个很大的帮助,但我认为在做了一些没有它的项目之后,它更有价值,这迫使学习objective-c内存管理。如果你明白它为你做了什么,ARC真的是一件好事。
- (void)dealloc {
    [web stopLoading:self];  // or webView, not sure what you call it
}