我正在创建一个工作流以浏览网站,工作流的每一步都必须加载n帧,然后知道其准备就绪(我必须实现超时)。
我不明白为什么[下一个自我]给我这个错误:
*-[WebWorkflow下一个]:消息发送到已释放实例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];
}
}
笔记:
-WebWorflow又称“自我”,是由另一个具有较强功能的类创建/绑定的
像这样:
@interface AController : NSObject <APIProtocol>
{
WebView *webview;
NSMutableArray *accounts;
WebWorkflow *workflow;
}
@property (strong) WebWorkflow *workflow;
...
我确实像这样创建工作流程:
workflow = [[WebWorkflow alloc] initWithWebView:webview];
NSArray *getPicturesWorkflow = [NSArray arrayWithObjects:
[[WebWorkflowStep alloc] initWithSelector:@"open" andLoadFrames:0],
[[WebWorkflowStep alloc] initWithSelector:@"login" andLoadFrames:2],
[[WebWorkflowStep alloc] initWithSelector:@"getPictures" andLoadFrames:8],
nil];
[workflow setSteps:getPicturesWorkflow];
它被初始化为:
-(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方法中的一个断点。
关于objective-c - ARC Objective-C:如何自我分配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14427185/