mah*_*udz 3 iphone cocoa-touch
我有一个更新视图的后台任务.该任务调用-setNeedsDisplay来绘制视图.
这有效:
- (void) drawChangesTask;
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
if (pixels) {
drawChanges((UInt32 *) origPixels, (UInt32 *) pixels, CGBitmapContextGetBytesPerRow(ctx)/4, CGBitmapContextGetHeight(ctx), count--);
if (count < 0) {
count = 150;
}
else
[self performSelectorInBackground:@selector(drawChangesTask) withObject:nil ];
[self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO ];
}
[pool release];
}
Run Code Online (Sandbox Code Playgroud)
这不起作用:
- (void) drawChangesTask;
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
if (pixels) {
drawChanges((UInt32 *) origPixels, (UInt32 *) pixels, CGBitmapContextGetBytesPerRow(ctx)/4, CGBitmapContextGetHeight(ctx), count--);
if (count < 0) {
count = 150;
}
else
[self performSelectorInBackground:@selector(drawChangesTask) withObject:nil ];
[self setNeedsDisplay];
}
[pool release];
}
Run Code Online (Sandbox Code Playgroud)
谁知道为什么?当我说它不起作用时,我的意思是它运行了数十次迭代,有时候我看到我的图像部分向上或向下移动,或者完全空白,然后欺骗者EXC_BAD_ACCESS在CoreGraphics的某个地方给我一个" ".
此外,如果我自己不处理自动释放池,那么我会收到泄漏的错误消息.不明白为什么会这样.我的drawChanges()不会创建任何新对象.这是错误:
2009-08-17 11:41:42.358 BlurApp[23974:1b30f] *** _NSAutoreleaseNoPool(): Object 0xd78270 of class NSThread autoreleased with no pool in place - just leaking
Run Code Online (Sandbox Code Playgroud)
UIKit 简单地说不是线程安全的 - 你需要调用在主线程上更新UIKit控件的方法.
我认为这一行:
[self performSelectorInBackground:@selector(drawChangesTask) withObject:nil];
Run Code Online (Sandbox Code Playgroud)
造成麻烦.您是否尝试过在当前线程上再次调用它?如果您需要在调用之间执行runloop,请使用:
[self performSelector:@selector(drawChangesTask) withObject:nil afterDelay:0.0];
Run Code Online (Sandbox Code Playgroud)
这将在您进入的方法完成并且runloop已经过一次后调用当前线程上的方法.