小编Dan*_*iel的帖子

NSOperationQueue与依赖项的错误

我正在使用NSOperation和NSOperationQueue执行一系列操作,所有这些操作都相互依赖(2对1,3对2等等).我在创建操作后设置依赖项.我在队列完成时遇到问题:程序在代码的_release部分崩溃,显然是在NSOperations被释放时.请注意,它们最后都是由队列释放的,因为它只是在最后一个依赖于最后一个的时间之后,这取决于等等......它们可以被释放.如果我删除任何依赖项,代码运行正常.如果我将waitUntilFinished:改为NO,它会崩溃,如果是,则不会.

我已将问题隔离到以下代码,该代码不使用任何自定义类.默认情况下,NSOperation是一个绝对没有任何内容的类.然而,当所有操作完成时,这仍然会崩溃.因此,看来我没有正确使用NSOperationQueue,但看不出有什么问题.我在10.9上运行,我注意到一般来说Maverick 10.9对这些问题比10.8更敏感.

我使用Menu项从主线程中调用此方法:

- (void) testOperations:(id)object  
{

        NSOperationQueue* queue = [ [ NSOperationQueue alloc ] init ];

        NSMutableArray* array = [ NSMutableArray array ];
        for ( int i = 0; i < 10000; i++)
            [ array addObject: [[[ NSOperation alloc ] init ] autorelease ] ];

        for ( int i = 1; i < [ array count ]; i++)
            [[ array objectAtIndex:i ] addDependency:[array objectAtIndex:i-1]]; // remove this and no crash

        [ queue addOperations: …
Run Code Online (Sandbox Code Playgroud)

objective-c nsoperationqueue

8
推荐指数
1
解决办法
1462
查看次数

在运行时检查 Swift 中第三方框架的弱链接符号

在 macOS 上,我使用必须由用户安装的外部框架(用 C 编写)。在 Swift 中,我需要在运行时检查它是否存在,并且我不能使用 #available() 因为它用于与操作系统相关的功能,并且我正在尝试追踪外部框架。另外,NSClassFromString() 没有用,因为它不是 Objective-C 框架。

我一直在尝试了解如何复制 Objective-C 等效项来检查弱链接符号,例如:

if ( anExternalFunction == NULL ) {
    // fail graciously
} else {
    // do my thing
}
Run Code Online (Sandbox Code Playgroud)

但在 Swift 中,这似乎不起作用:编译器指出,由于 anExternalFunction 不是可选的,所以我总是会得到 != nil,这使得“Swift 有意义”,但对我没有一点帮助。

我找到了两种解决方案,但它们让我的代码变得很糟糕,就像你不会相信的那样:

选项 1,使用名为 isFrameworkAvailable() 的函数创建一个 Objective-C 文件来完成工作,并从 Swift 调用

选项 2,使用以下 Swift 代码实际检查库:

let libHandle = dlopen("/Library/Frameworks/TheLib.framework/TheLib", RTLD_NOW)

if (libHandle != nil) {
    if dlsym(libHandle, "anExternalFunction") != nil {
        return true
    }
}
return false
Run Code Online (Sandbox Code Playgroud)

我一直无法让选项 2 与 RTLD_DEFAULT …

dll frameworks dlsym weak-linking swift

5
推荐指数
1
解决办法
732
查看次数