gpt4 book ai didi

iphone - -[NSOperationQueue操作]返回一个不应该的空数组?

转载 作者:行者123 更新时间:2023-12-03 16:03:49 24 4
gpt4 key购买 nike

我正在编写一个应用程序,它将图像异步加载到屏幕上。我将其设置为非并发(即,它生成一个线程并一次执行一个线程),因此我只重写了 NSOperation 子类中的 [NSOperation main] 函数。

无论如何,当我添加所有这些操作时,我希望稍后能够访问排队的操作以更改其优先级。不幸的是,每当我调用 -[NSOperationQueue Operations] 时,我得到的只是一个空数组。最好的部分是,在放入一些控制台打印语句后,尽管数组为空,线程仍然在队列中并执行(由打印指示)!

什么给了?我还查看了 adcount,以确保它们不会同时执行,但情况似乎并非如此。

有什么想法吗?这让我抓狂。

编辑:还值得一提的是,相同的代码在模拟器中运行时提供完整的数组:(

最佳答案

我单步执行了-operations,发现它基本上在做:

[self->data->lock lock];
NSString* copy = [[self->data->operations copy] autorelease];
[self->data->lock unlock];
return copy;

除了在调用-autorelease之后,后续指令会覆盖包含指向操作队列新副本的唯一指针的寄存器。然后调用者只得到一个nil返回值。 “data”字段是名为 _NSOperationQueueData 的内部类的实例,该内部类具有以下字段:

NSRecursiveLock* lock;
NSArray* operations;

我的解决方案是子类化并重写-operations,遵循相同的逻辑,但实际上返回数组副本。我添加了一些健全性检查,以解决 NSOperationQueue 的内部结构与此修复不兼容的问题。仅当对[super操作]的调用实际上返回nil时,才会调用此重新实现。

如果 Apple 要更改内部结构,这可能会在未来的操作系统版本中出现问题,但又以某种方式避免实际修复此错误。

#if TARGET_OS_IPHONE

#import <objc/runtime.h>

@interface _DLOperationQueueData : NSObject {
@public
id lock; // <NSLocking>
NSArray* operations;
}
@end
@implementation _DLOperationQueueData; @end

@interface _DLOperationQueueFix : NSObject {
@public
_DLOperationQueueData* data;
}
@end
@implementation _DLOperationQueueFix; @end

#endif


@implementation DLOperationQueue

#if TARGET_OS_IPHONE

-(NSArray*) operations
{
NSArray* operations = [super operations];
if (operations != nil) {
return operations;
}

_DLOperationQueueFix* fix = (_DLOperationQueueFix*) self;
_DLOperationQueueData* data = fix->data;

if (strcmp(class_getName([data class]), "_NSOperationQueueData") != 0) {
// this hack knows only the structure of _NSOperationQueueData
// anything else, bail
return operations;
}
if ([data->lock conformsToProtocol: @protocol(NSLocking)] == NO) {
return operations; // not a lock, bail
}

[data->lock lock];
operations = [[data->operations copy] autorelease];
[data->lock unlock];
return operations; // you forgot something, Apple.
}

#endif

@end

头文件是:

@interface DLOperationQueue : NSOperationQueue {}
#if TARGET_OS_IPHONE
-(NSArray*) operations;
#endif
@end

关于iphone - -[NSOperationQueue操作]返回一个不应该的空数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/248985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com