iphone – – [NSOperationQueue *** 作]当不应该返回一个空数组?

iphone – – [NSOperationQueue *** 作]当不应该返回一个空数组?,第1张

概述我正在写一个应用程序,将图像异步加载到屏幕上.我设置它不是并发的(即它产生一个线程并一次执行一个线程),所以我只是在NSOperation子类中覆盖了[NSOperation main]函数. 无论如何,所以当我添加所有这些 *** 作,我希望能够以后访问排队的 *** 作来改变他们的优先级.不幸的是,每当我打电话 – [NSOperationQueue *** 作],我回来的都是一个空数组.最好的部分是,在放入一些控制 我正在写一个应用程序,将图像异步加载到屏幕上.我设置它不是并发的(即它产生一个线程并一次执行一个线程),所以我只是在NSOperation子类中覆盖了[NSOperation main]函数.

无论如何,所以当我添加所有这些 *** 作,我希望能够以后访问排队的 *** 作来改变他们的优先级.不幸的是,每当我打电话 – [NSOperationQueue *** 作],我回来的都是一个空数组.最好的部分是,在放入一些控制台打印语句之后,尽管数组是空的,线程仍然在队列中并执行(由打印机指示)!

是什么赋予了?我也看了一下这个帐号,以确保它们都不会立即执行,而且似乎并非如此.

有任何想法吗?把我的头发拉出来.

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

解决方法 我通过 *** 作,发现它基本上在做:

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

除了在调用-autorelease之后,后续指令将覆盖包含唯一指向 *** 作队列的新副本的寄存器的指令.然后调用者只得到一个零返回值. “数据”字段是一个名为_NSOperationQueueData的内部类的实例,它具有字段:

NSRecursiveLock* lock;NSArray* operations;

我的解决方案是按照相同的逻辑进行子类化和重写 *** 作,但实际上返回数组副本.如果NSOperationQueue的内部与此修复程序不兼容,我添加了一些健康检查.仅当调用[super operations]实际上返回nil时才调用此重新实现.

如果苹果公司改变内部结构,这可能会在未来的 *** 作系统版本中破裂,但以某种方式避免实际修复这个错误.

#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 *** 作]当不应该返回一个空数组?全部内容,希望文章能够帮你解决iphone – – [NSOperationQueue *** 作]当不应该返回一个空数组?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1026612.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存