2015-09-01 106 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

相關問題