2015-09-01 59 views
-2

在我目前的项目中,我得到exc_bad_access随机,但总是在同一行代码(从方法返回一个NSNumber对象时)。iOS - EXC_BAD_ACCESS - 在ARC下如何发生?

问题是,exc_bad_access怎么可能在ARC下发生?

我没有使用任何unsafe_unretained指针或类似的东西。

在此线程第一个答案似乎可以解释这些错误的一个可能的原因,但不幸的是,我不太明白的设置:

EXC_BAD_ACCESS using ARC and can't track on simulator

有getImageVersion在类的接口它:

@interface PhotoFetcher : NSObject { 

NSMutableData *photoData; 
NSString *photoNick; 

NSNumber *imageVersion; // <---- Strong ivar 

PhotoSize photoSize; 
} 

这里的崩溃方法:

- (int)getImageVersion:(NSString *)nick 
{ 
if (nick && !imageVersion) 
{ 
    imageVersion = [[RuntimeData sharedData].nickImageVersionCache imageVersionForNick:nick]; 
    if (!imageVersion) 
    { 
     NSManagedObjectContext *context = [[RuntimeData sharedData].knuddelsDataStore managedObjectContext]; 

     [context performBlockAndWait:^{ 
      NSFetchRequest *userRequest = [NSFetchRequest fetchRequestWithEntityName:@"ConversationUser"]; 
      userRequest.predicate = [NSPredicate predicateWithFormat:@"nickname = [c] %@", nick]; 
      userRequest.propertiesToFetch = @[@"imageVersion"]; 
      userRequest.resultType = NSDictionaryResultType; 
      userRequest.fetchLimit = 1; 

      NSArray *objects = [context executeFetchRequest:userRequest error:nil]; 
      if (objects.count > 0) 
      { 
       NSDictionary *dict = objects[0]; 

       imageVersion = dict[@"imageVersion"]; 

       [[RuntimeData sharedData].nickImageVersionCache setImageVersion:imageVersion forNick:nick]; 
      } 
     }]; 
    } 
} 
return imageVersion.intValue; // <<<<----- Line of Crash, exc_bad_access 
} 

这就是堆栈跟踪:

Stacktrace

+0

这是Swift还是ObjC?你在使用核心数据吗? – Sajjon

+0

ObjC和CoreData – Max

+1

嗨,你可以附加堆栈跟踪? –

回答

-2

根据我的经验,这种情况发生的时候我叫了一个不存在的方法或属性。换句话说,如果ImageVersion是零,它没有intValue。

你应该检查你的代码。

+1

如果imageVersion为零,在尝试访问intValue之前,由于Objective-C运行时检查nil,它不会崩溃。在它为零的情况下,将返回0。 – Max

+1

EXC_BAD_ACCESS是由解除引用无效指针而引起的,而不是通过调用不存在的方法,而是导致“IllegalArgumentException”异常。 – jlehr

+0

啊oke,抱歉误解和感谢解释!现在我想到了,我确实有IllegalArgumentException .. – JorisH

0

在Objective-C中,每个对象都可以为零。

因为当您试图访问您的NSManagedObject上的属性时,您会得到EXC_BAD_ACCESS我会说您可能已经忘记检查该属性的核心数据模型中的“可选”。我想你是从一些后端服务器转换成核心数据对象的JSON?也许所述属性的JSON值为null。

使用核心数据时,如果您将空值插入到未选中“可选”标志的变量中,则在访问该变量时,如果它为空,您将获得EXC_BAD_ACCESS。

+0

但我没有直接访问NSManagedObject。你确定这可能是原因吗? (我只是试图找出如何使属性可选,测试你说什么) – Max

相关问题