针对SwiftNSPredicate在复合语句时抛出EXC_BAD_ACCESS和Code=1,address=0x1这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展block野指针cras
针对Swift NSPredicate在复合语句时抛出EXC_BAD_ACCESS和Code = 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)
- 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)错误,我在做什么错?
这是发生错误的文件
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了,无脑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移植到使用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(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(野指针错误):访问了一块已经被回收,不可用的内存。
僵尸对象:所占用内存已经被释放的对象
野指针:指向僵尸对象,不可用内存的指针
空指针:没有指向任何对象(nil,NULL,0)
如果对象已经变为野指针,不能再用其发送消息,要致为nil(空指针),空指针发送消息不回报错,空指针已经不再指向已经被释放的内存。
默认情况下,Xcode是不会管僵尸对象的,使用一块被释放的内存也不会报错。为了方便调试,应该开启僵尸对象监控
今天关于Swift NSPredicate在复合语句时抛出EXC_BAD_ACCESS和Code = 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错误等更多相关知识的信息可以在本站进行查询。
本文标签: