GVKun编程网logo

Swift NSPredicate在复合语句时抛出EXC_BAD_ACCESS(Code = 1,address = 0x1)

18

针对SwiftNSPredicate在复合语句时抛出EXC_BAD_ACCESS和Code=1,address=0x1这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展block野指针cras

针对Swift NSPredicate在复合语句时抛出EXC_BAD_ACCESSCode = 1,address = 0x1这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展block野指针crash: Thread 1:EXC_BAD_ACCESS(code=1,address=0x10)、c – 为什么dispatch_queue_create在Swift中出现EXC_BAD_ACCESS错误?、EXC_BAD_ACCESS 重现、EXC_BAD_ACCESS错误等相关知识,希望可以帮助到你。

本文目录一览:

Swift NSPredicate在复合语句时抛出EXC_BAD_ACCESS(Code = 1,address = 0x1)

Swift NSPredicate在复合语句时抛出EXC_BAD_ACCESS(Code = 1,address = 0x1)

我正在尝试在Swift中使用NSPredicate来查询核心数据,但是在尝试运行它时抛出EXC_BAD_ACCESS(Code = 1,address =
0x1)错误,我在做什么错?

这是发生错误的文件

class LevelsScreenModel : UIViewController {func getWord(level: Int, section: Int) -> String{    let fetchRequest = NSFetchRequest(entityName: "Words")    //This is the line where the error happens    fetchRequest.predicate = NSPredicate(format: "level = %@", level)    fetchRequest.predicate = NSPredicate(format: "section = %@", section)    let word = AppDelegate().managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as [Words]    if(word.count > 1)    {        for words in word        {            println(words.word)            return words.word        }    }    return "ERROR"  }}

答案1

小编典典

%@谓词格式字符串中的占位符用于Objective-C对象,因此您必须将整数包装为NSNumber

fetchRequest.predicate = NSPredicate(format: "level = %@", NSNumber(integer: level))

或改用ld格式化(长)整数:

fetchRequest.predicate = NSPredicate(format: "level = %ld", level)

另请注意

fetchRequest.predicate = NSPredicate(format: ...)fetchRequest.predicate = NSPredicate(format: ...)

没有 创建复合谓词,使秒针分配简单地覆盖第一。您可以使用NSCompoundPredicate

let p1 = NSPredicate(format: "level = %ld", level)!let p2 = NSPredicate(format: "section = %ld", section)!fetchRequest.predicate = NSCompoundPredicate.andPredicateWithSubpredicates([p1, p2])

或简单地将谓词与“ AND”组合:

fetchRequest.predicate = NSPredicate(format: "level = %ld AND section = %ld", level, section)

block野指针crash: Thread 1:EXC_BAD_ACCESS(code=1,address=0x10)

block野指针crash: Thread 1:EXC_BAD_ACCESS(code=1,address=0x10)

以前block调用用的也是同样的方法,但是这次就Crash了,无脑crash,一调用就crash,控制台还不打印任何crash信息,然后问度娘说是野指针问题,说实话,一行一行代码看的,找了几个小时,后来发现原来是导航控制器push的时候创建了新的实例,导致系统把老的实例释放掉了(蛋疼)。

先说下我要实现的功能:从根控制器跳到第一个控制器,然后在第一个控制器中调用block改变根个控制器的背景色并返回第一个控制器。

第一个控制器中的代码:

// 将要跳转的第二个控制器

@property (nonatomic, strong) BSOneController *oneVC;

- (void)viewDidLoad {

    [super viewDidLoad];

    BSOneController *oneVC = [[BSOneController alloc] init];

    self.oneVC = oneVC;

    oneVC.changeColor = ^(UIColor *color) {

        self.view.backgroundColor = color;

        [self.navigationController popViewControllerAnimated:YES];

    };

}

- (void)goOneVC:(UIButton *)btn{

    // 崩溃原因:就是在这里又创建了一个新的实例,导致上面self.oneVC被提前释放,然后又调用实例的block导致crash

//    BSOneController *one = [[BSOneController alloc] init];

//    [self.navigationController pushViewController:one animated:YES];

    

    [self.navigationController pushViewController:self.oneVC animated:YES];

}

 

c – 为什么dispatch_queue_create在Swift中出现EXC_BAD_ACCESS错误?

c – 为什么dispatch_queue_create在Swift中出现EXC_BAD_ACCESS错误?

我正在将一些代码从C移植到使用Grand Central dispatch的Swift,我发现一个奇怪的错误,dispatch_queue_create看起来根本不起作用.

例如,在我的C基类头中,我会声明

dispatch_queue_t m_WorkQ;

并在初始化器中,放

m_ResultQ = dispatch_queue_create("com.myapp.mHitsUpdateQueue", 0);

……一切都很光荣.

我在Swift中尝试过这个,在我的课堂上,在课堂上声明这个:

var resultQueue: dispatch_queue_t

……在初始化者中,我有(除其他外)这条线

resultQueue = dispatch_queue_create("com.myapp.mHitsUpdateQueue", 0)

…它编译并启动正常,但在上面的行上给我一个EXC_BAD_ACCESS(代码= 1,地址= 0x37)的立即运行时错误

为了确定它是否是我做过的任何其他事情,我创建了一个仅包含以下代码的命令行工具应用程序:

import Foundation

var thisQueue = dispatch_queue_create("com.myApp.mHitsUpdateQueue", 0)

println(thisQueue.description)

……果然,我在“thisQueue”分配线上得到了上述错误.所以我非常确定有一些关于Swift和GCD队列创建非常明显的东西,我很遗憾.

有人可以帮帮我吗?

解决方法:

dispatch_queue_create()的第二个参数具有类型
dispatch_queue_attr_t,声明为

typealias dispatch_queue_attr_t = NSObject

您必须为串行队列传递disPATCH_QUEUE_SERIAL或nil
(或并发队列的disPATCH_QUEUE_CONCURRENT):

var thisQueue = dispatch_queue_create("com.myApp.mHitsUpdateQueue", disPATCH_QUEUE_SERIAL)

在C()中,可以传递0而不是NULL指针.

但是,Swift编译器将整数0包装到NSNumber对象中
这样它就可以传递给期望NSObject的函数
参数.这会导致运行时异常,因为NSNumber是
不是有效的属性.所以传球0或零是
在Swift中有很大的不同.

EXC_BAD_ACCESS 重现

EXC_BAD_ACCESS 重现

exc_bad_access(code=1, address=0x789870)野指针错误,主要的原因是,当某个对象被完全释放,也就是retainCount,引用计数为0后。再去通过该对象去调用其它的方法就会出现野指针错误。

错误代码:

TestEntity.h

#import <Foundation/Foundation.h>

@interface TestEntity : NSObject

@property(nonatomic,assign) NSString *time;

@end

TestEntity.m

@implementation TestEntity

@end

CallTest.m

#import "TestEntity.h"

@interface CallTest()
@property(strong) TestEntity *test;
@end

@implementation CallTest

-(void)viewDidLoad {
    test = [TestEntity new];
}

-(void)viewWillAppear:(BOOL)animated {
    UILabel *content = [[UILabel alloc] initWithFrame:CGRectZero];
    content.translatesAutoresizingMaskIntoConstraints = NO;
    content.font = [UIFont systemFontOfSize:16];
    content.textColor = [UIColor whiteColor];
    //下面一行代码有可能会产生 EXC_BAD_ACCESS 错误
    content.text = test.time;
    content.numberOfLines = 0;
    content.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:content];
    [content lyt_alignLeftToParent];
    [content lyt_alignRightToParent];
}

@end


EXC_BAD_ACCESS错误

EXC_BAD_ACCESS错误

EXC_BAD_ACCESS(野指针错误):访问了一块已经被回收,不可用的内存。

僵尸对象:所占用内存已经被释放的对象

野指针:指向僵尸对象,不可用内存的指针

空指针:没有指向任何对象(nil,NULL,0)

如果对象已经变为野指针,不能再用其发送消息,要致为nil(空指针),空指针发送消息不回报错,空指针已经不再指向已经被释放的内存。

默认情况下,Xcode是不会管僵尸对象的,使用一块被释放的内存也不会报错。为了方便调试,应该开启僵尸对象监控





今天关于Swift NSPredicate在复合语句时抛出EXC_BAD_ACCESSCode = 1,address = 0x1的介绍到此结束,谢谢您的阅读,有关block野指针crash: Thread 1:EXC_BAD_ACCESS(code=1,address=0x10)、c – 为什么dispatch_queue_create在Swift中出现EXC_BAD_ACCESS错误?、EXC_BAD_ACCESS 重现、EXC_BAD_ACCESS错误等更多相关知识的信息可以在本站进行查询。

本文标签: