Objective c ARC目标C:如何解除自我分配?
我正在创建一个工作流程来浏览网站,工作流程的每一步都必须加载n帧,然后知道它准备好了,我必须执行超时 我不明白为什么[self next]会给我这个错误: *-[WebWorkflow next]:消息已发送到解除分配的实例0x105796ef0 考虑到这一委托职能: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
- (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
}