gpt4 book ai didi

iphone - 由于 'objc_getClassList returned more classes than it should have.',运行单元测试时应用程序崩溃

转载 作者:行者123 更新时间:2023-11-29 10:58:03 25 4
gpt4 key购买 nike

我一直在为这个错误而苦苦挣扎,最后我深入研究了这段代码。此代码在您“运行”应用程序时运行良好,但在“测试”时会导致应用程序崩溃。我用谷歌搜索并发现了这个问题:

Occasional errors when running OCUnit application test suite on device

但是这个解决方案对我不起作用;-(

我是一名 iOS 开发新手,所以我不确定这段代码是否做了什么坏事。谁能告诉我:

  1. 是否可以像 application:didFinishLaunchingWithOptions: 方法那样完成工作?
  2. 为什么这段代码会报错?

谢谢!

#import "BRAppDelegate.h"
#import <AssetsLibrary/AssetsLibrary.h>

@implementation BRAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) {
ALAssetsLibrary *lib = [ALAssetsLibrary new];
[lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop){
[group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){

}];
} failureBlock:^(NSError *error){

}];

});
return YES;
}

编辑

最奇怪的是如果我注释掉

[group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){

}];

没有发生崩溃!

最佳答案

ALAssetLibrary 在主线程以外的任何线程上运行都是不安全的。您使用 GCDD 将其分派(dispatch)到后台,因此在另一个线程中运行。

阅读:http://death-mountain.com/2011/05/alassetslibrary-and-threads/

还要争先恐后地避免在枚举 Assets 库时改变它。那也很糟糕:Has anyone experienced crashes when using ALAssetsLibrary in a background thread?


但主要问题是你如何使用我认为的库...

你在一个 block 中分配它..一个新的:但是在一个 block 中所以它在 block 完成后就消失了,因为没有其他人持有它。

lib的分配移动到主线程中,并将其作为成员变量保存在app delegate中

所以:

// Override point for customization after application launch.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) {
ALAssetsLibrary *lib = [ALAssetsLibrary new];

变成:

@implementation AppDelegate {
ALAssetsLibrary *_lib;
}

...

// Override point for customization after application launch.
_lib = [ALAssetsLibrary new];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) {

关于iphone - 由于 'objc_getClassList returned more classes than it should have.',运行单元测试时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17326925/

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