我正在关注本教程,作为我正在Swift工作的RSS馈送器应用程序的快速入门.我知道自从本教程以来Swift中有一些变化,但它们似乎都没有解释为什么我遇到这个问题.
相关代码(据我所知)在我的TableViewController中如下:
override func viewDidLoad() {
super.viewDidLoad()
let url:NSURL = NSURL(string: "my.url.string")
parser = NSXMLParser(contentsOfURL: url)
parser.delegate = self
parser.parse() // <- Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
}
Run Code Online (Sandbox Code Playgroud)
实际的解析器委托方法似乎没有问题,因为我在它们上放置了断点,甚至在崩溃之前都没有调用它们.
我的假设是它是一个Swift错误,但我想在我向苹果抱怨之前确保我没有遗漏一些东西.
我通过Crashlytics在我的应用程序中收到此错误.我无法找到崩溃发生的地点和方式.以下是Crashlytics的日志:
Thread : Crashed: com.apple.main-thread
0 CoreLocation 0x0000000183f62304 (null) + 60044
1 CoreLocation 0x0000000183f230f0 (null) + 1436
2 CoreLocation 0x0000000183f230f0 (null) + 1436
3 CoreLocation 0x0000000183f2261c (null) + 1980
4 CoreFoundation 0x0000000183754c9c __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 28
5 CoreFoundation 0x0000000183754940 __CFRunLoopDoTimer + 884
6 CoreFoundation 0x0000000183752054 __CFRunLoopRun + 1520
7 CoreFoundation 0x0000000183680dc0 CFRunLoopRunSpecific + 384
Run Code Online (Sandbox Code Playgroud)
并且还说明了:崩溃:com.apple.main-thread EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x6136383561626000
有人能指出我正确的方向吗?谢谢
我正在使用FMDB处理我的数据库工作正常.该应用程序使用后台线程,它正在做一些工作,需要访问数据库.同时主线程需要在同一个数据库上运行一些查询.FMDB本身有一个小锁定系统,但是,我在我的类中添加了另一个.
只有当我的类指示数据库未使用时,才会执行每个查询.执行操作后,数据库将解锁.只要负载不是太高,这就可以正常工作.当我在主线程上运行的线程访问大量数据时,会发生EXC_BAD_ACCESS错误.
这是看起来:
- (BOOL)isDatabaseLocked {
return isDatabaseLocked;
}
- (Pile *)lockDatabase {
isDatabaseLocked = YES;
return self;
}
- (FMDatabase *)lockedDatabase {
@synchronized(self) {
while ([self isDatabaseLocked]) {
usleep(20);
//NSLog(@"Waiting until database gets unlocked...");
}
isDatabaseLocked = YES;
return self.database;
}
}
- (Pile *)unlockDatabase {
isDatabaseLocked = NO;
return self;
}
Run Code Online (Sandbox Code Playgroud)
调试器说错误发生[FMResultSet next]在该行
rc = sqlite3_step(statement.statement);
Run Code Online (Sandbox Code Playgroud)
我仔细检查了所有保留计数,此时所有对象都存在.同样,它只发生在主线程在后台线程运行时启动大量查询时(它本身总是产生很大的负载).错误总是由主线程产生,而不是由后台线程产生.
我的最后一个想法是两个线程同时运行lockedDatabase,这样他们就可以得到一个数据库对象.这就是我通过"@synchronized(self)"添加互斥锁定的原因.但是,这没有帮助.
有人有线索吗?
我得到了一个有趣的崩溃,我似乎无法在模拟器上复制:
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000008
Crashed Thread: 0
Thread 0 Crashed:
0 libobjc.A.dylib 0x3212e86c 0x3212c000 + 10348
1 StockTwits 0x00016b06 0x1000 + 88838
2 Foundation 0x30718422 0x306db000 + 250914
3 Foundation 0x307183a4 0x306db000 + 250788
4 CFNetwork 0x30933e74 0x30923000 + 69236
5 CFNetwork 0x30927b70 0x30923000 + 19312
6 CFNetwork 0x30927e62 0x30923000 + 20066
7 CFNetwork 0x30927a60 0x30923000 + 19040
8 CFNetwork 0x30927a12 0x30923000 + 18962
9 CFNetwork 0x30927990 0x30923000 + 18832
10 CFNetwork 0x3092790e 0x30923000 …Run Code Online (Sandbox Code Playgroud) 帮助,我已经在这几周乱砍了!我有这个应用程序我在模拟器中开发,我已经做了很多UI的东西,它只是与数据有趣的部分.它在启动时立即启动,大约90%的时间我运行它,它会引发EXC_BAD_ACCESS异常.
我已经注释掉了我的所有发布消息,甚至还添加了一些保留消息,以确保它不会过度发布.奇怪的是,有时我在代码中做的事情会使它工作,然后它会工作,直到我再次进行代码更改.然后我注释掉我添加的新代码,它仍然崩溃.
我已经在网上阅读了十几篇关于此的文章,尝试了他们建议的内容.我设置了断点,仍然无法弄清楚它在哪里.当我在调试器中单击调用堆栈时,显示源代码的唯一位置是主要的底层.
调试器有这个堆栈,但每次崩溃时都会有一点波动.不一致的性质告诉我有一些记忆它是自动释放的,但我不知道如何找出什么.
0 objc_msgSend
1 ??
2 _CFAutoReleasePoolPop
3 -[NSAutoReleasePool release]
4 _UIApplicationHandleEvent
5 PurpleEventCallback
6 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
7 __CFRunLoopDoSource1
8 __CFRunLoopRun
9 CFRunLoopRunSpecific
10 CFRunLoopRunInMode
11 -[UIApplication _run]
12 UIApplicationMain
13 main
Run Code Online (Sandbox Code Playgroud)
还有一些事实:
我有一个用链接器标志EXC_BAD_ACCESS调用的时候objc_setAssociatedObject:-weak_library /usr/lib/libSystem.B.dylib链接器标志.
我绝对需要链接器标志因为这个,有人知道一个解决方法吗?
(我也遇到了崩溃,dispatch_async但我可以解决这个问题...另外,我正在我的应用程序上构建iOS 4兼容的iOS 3兼容功能)
我有一个问题,我得到了错误的访问异常,但只有在运行测试版本时(在调试版本中调用相同的方法不会导致问题出现).该项目启用了ARC,我使用Xcode 4.3在iPad 5.1模拟器上运行它:
这就是问题出现的地方:
- (void)testChangeFoodNotification {
Player* p = [[Player alloc] init];
[p addObserver:self forKeyPath:@"food" options:0 context:0]; // <-EXC_BAD_ACCESS (code=2)
p.food += 1;
STAssertTrue(_wasNotifiedOfFoodChange, nil);
}
Run Code Online (Sandbox Code Playgroud)
在addObserver:调用该方法时,似乎不应该释放任何涉及的对象,那么可能导致异常的原因是什么?
编辑:
如果不清楚但上面的代码是作为测试用例的一部分执行(使用标准的Xcode OCUnit),请道歉.此外,如果它澄清了这里的任何内容,那么来自播放器类的相关代码(还有其他的ivars和方法,但它们与被测试的属性或方法没有任何关联):
// Public interface
@interface Player : NSObject
@property (nonatomic, assign) NSInteger food;
@end
// Private interface
@interface Player() {
NSInteger _food;
}
@end
@implementation Player
@synthesize food = _food;
#pragma mark - Getters/Setters
- (void)setFood:(NSInteger)food {
[self willChangeValueForKey:@"food"];
_food = food;
[self didChangeValueForKey:@"food"];
}
Run Code Online (Sandbox Code Playgroud) 我们的用户在下面的方法中遇到重复崩溃.坠机事件中的行的一个经常发生:[lbl sizeToFit](的lbl.变量重新初始化和重复使用,以我的理解,这应该不会造成任何问题).
这些崩溃只发生在iOS8上(同样的方法在ios7上使用了很长时间没有任何问题).我无法重建这个崩溃我自己.目前,我唯一的主要是来自'sizeToFit'苹果文档:
..在某些情况下,如果视图没有超视图,它可能会将自身调整为屏幕边界.因此,如果您希望给定视图将其自身调整为其父视图,则应在调用此方法之前将其添加到父视图.
但是,我不知道这会如何产生糟糕的内存参考.
-(void)setUpHeaders:(NSInteger)fortype{
headers = [NSMutableArray array];
if(fortype == GROUP_BY_TIME){
for(int i=0;i<4;i++){
UIView* header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 68)];
header.backgroundColor = [UIColor whiteColor];
[headers addObject:header];
}
int today = (int)[NSDate dayOfTheWeekOfDate:[NSDate date]];
int firstDayOfTheWeek = (int)[defaults integerForKey:FIRST_DAY_IF_THE_WEEK_KEY];
NSString* restOfTheWeek = nil;
if(today == ((firstDayOfTheWeek + 4) % 7) + 1) restOfTheWeek = MyLocalizedString(@"THE COMING WEEK", @"THE COMING WEEK") ;
else if(today == ((firstDayOfTheWeek + 5) % 7) + 1) restOfTheWeek = …Run Code Online (Sandbox Code Playgroud) 我下面有一个简单的课程
import Foundation
public class UsefulClass: NSObject{
var test:NSNumber{
get{return self.test}
set{
println(newValue)
self.test = newValue
}
}
override init() {
super.init()
self.test = 5;
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里初始化它
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var testClass = UsefulClass()
}
}
Run Code Online (Sandbox Code Playgroud)
但是由于EXC_BAD_ACCESS代码= 2,它会导致xcode打印出200 5s然后崩溃.为什么会发生这种情况?
我在双击事件后调用以下代码,以便在鼠标位置打开一个小窗口。它工作正常,并且每次都会重新出现在新位置,但如果我先手动关闭窗口,则会收到 EXC_BAD_ACCESS 错误。
win = [[NSWindow alloc] initWithContentRect:frame
styleMask:(NSTitledWindowMask | NSClosableWindowMask)
backing: NSBackingStoreBuffered
defer:false];
[win makeKeyAndOrderFront:NSApp];
Run Code Online (Sandbox Code Playgroud)
并且窗口在调用上面代码的视图的接口中声明
@interface myView : NSView
{
NSWindow *win;
}
Run Code Online (Sandbox Code Playgroud)
如果相关的话,我正在使用 ARC,并且在调试器中我可以看到win在关闭之后以及尝试重新创建它之前它不是 nil,尽管它的 contentView 已变为 nil。
感谢您提供任何线索。
exc-bad-access ×10
ios ×4
iphone ×4
objective-c ×4
swift ×2
cocoa ×1
cocoa-touch ×1
debugging ×1
fmdb ×1
ios8 ×1
macos ×1
nswindow ×1
nsxmlparser ×1
ocunit ×1
setter ×1
sizetofit ×1
sqlite ×1
uilabel ×1
xcode ×1
xcode6 ×1