2013-03-21 29 views
0

我上次发布在Stackowerflow上,我搞砸了,因为我认为我知道的比我多。重命名方法使其更容易,并且使所有事情变得非常混乱。所以我现在要再试一次。不能发现错误,EXC_BAD_ACCESS

无论如何,我的应用程序已被Apple拒绝了几次,我找不到这个bug。我一直在运行模拟器以及AD-HOC安装,似乎无法找到该错误,甚至无法复制它。

我没有警告,一直在使用静态分析器,也找不到任何问题。

我是新来的目标C,认为我做错了我如何使用类方法,但我不知道。

这是最后一个,崩溃的类方法“itemStatus”。

我正在使用ARC的方式。

任何帮助将不胜感激。

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
    Exception Codes: KERN_INVALID_ADDRESS at 0x432b2b10 
    Crashed Thread: 0 

    Thread 0 name: Dispatch queue: com.apple.main-thread 
    Thread 0 Crashed: 
    0 libobjc.A.dylib     0x3a3c3526 objc_retain + 6 
    1 Kebunno      0x0008928a +[DynamoDBManager itemStatus] + 418 
    2 Kebunno      0x000894de +[DynamoDBManager getItem:] + 170 
    3 Kebunno      0x000908f6 __44-[KebunnoViewController itemPressed]_block_invoke + 362 

一流

@interface KebunnoViewController() 

// Interface declarations here 

@end 


@implementation KebunnoViewController 

- (IBAction)itemPressed:(id)sender { 
    NSString *itemID = _itemID.text; 
    NSString *reference = _reference.text; 


    BOOL itemCorrect = NO; 
    if([ItemHelpClass validItem:itemID]){ 
    itemCorrect = YES; 
    } 

    if(!itemCorrect){ 
     [[ItemHelpClass showItemNotCorrect:self] show]; 
     return; 
    } 


    else if(itemCorrect){ 
     [self startCancelTimer]; 
     [self disableButtons]; 

     dispatch_queue_t backgroundQueue = dispatch_queue_create("background queue", NULL); 
     dispatch_async(backgroundQueue, ^{ 
      NSString *itemStatus; 
      itemStatus = [DynamoDBManager getItem:itemID]; //crash 

     if([itemStatus isEqualToString:NETWORK_ERROR] || 
      [itemStatus isEqualToString:AMAZON_ERROR]){ 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        [self enableButtons]; 
        [[ItemHelpClass showSomethingWentWrong:self] show]; 
       }); 
      } 

//Code continues 
} 

@end 

称为DynamoDBMangar.m

@implementation DynamoDBManager 

+(NSString*)getItem:(NSString *)itemID { 
    NetworkStatus netStatus = 
    [[Reachability reachabilityForInternetConnection]currentReachabilityStatus]; 

    if(netStatus == NotReachable) 
    { 
     return NETWORK_ERROR; 
    } 

    NSString *itemStatus = [self itemStatus]; //crash 
    if([itemStatus isEqualToString: ITEM_BORROWED]){ 
     return ITEM_BORROWED; 
    } 
    else if([itemStatus isEqualToString:NETWORK_ERROR]) 
    { 
     return NETWORK_ERROR; 
    } 

//Code continues 
} 



+(NSString*) itemStatus{ 
    NetworkStatus netStatus = [[Reachability reachabilityForInternetConnection]currentReachabilityStatus]; 
    if(netStatus == NotReachable) 
    { 
     return NETWORK_ERROR; 
    } 


    @try 
    { 

     DynamoDBGetItemRequest *request = [[DynamoDBGetItemRequest alloc] initWithTableName: TABLE_CONTENT andKey:[[DynamoDBKey alloc] initWithHashKeyElement: 
                    [[DynamoDBAttributeValue alloc] initWithS:[ItemHelpClass getItem]]]]; 

     DynamoDBGetItemResponse *response = [[AmazonClientManager ddb] getItem:request]; 
     if(response){ 
      if(((DynamoDBAttributeValue *)[response.item objectForKey:@"UID_ID"]).s){ 
       return ITEM_BORROWED; 
      } 
      else{ 
       return ITEM_NOT_BORROWED; 
      } 
     } 

    }@catch (NSException *exception) 
    { 
     [AmazonClientManager wipeCredentialsOnAuthError:exception]; 
    } 
    return NETWORK_ERROR; 

} 

@end 

编辑另一个文件:CPU状态

Thread 0 crashed with ARM Thread State (32-bit): 
    r0: 0x200c55c0 r1: 0x432b2b00  r2: 0x00000002  r3: 0x00000020 
    r4: 0x00000001 r5: 0x200a2d10  r6: 0x1f5c67f0  r7: 0x2fd95a08 
    r8: 0x200a4260 r9: 0x000fc09c  r10: 0x1f5c4c40  r11: 0x200a44e0 
    ip: 0x3c33c050 sp: 0x2fd95960  lr: 0x0008928f  pc: 0x3a3c3526 
    cpsr: 0x00000030 
+1

不要公关带'get'的efix方法;这是保留给一个非常具体的模式(通过引用传递),这不是它。 – bbum 2013-03-21 14:14:19

+0

好的,你在那里。我习惯于java编程并使用“getters”和“setters”。应该避免在目标中使用它C – M3rd0n 2013-03-21 14:18:19

+1

不用担心 - 不是问题的根源,但与基础API的一致性总是好的。你如何声明和初始化各种常量(即NETWORK_ERROR,ITEM_BORROWED等)? – bbum 2013-03-21 14:19:12

回答

-1
@catch (NSException *exception) 
    { 
     [AmazonClientManager wipeCredentialsOnAuthError:exception]; 
     return NULL; 
    } 
+1

这应该如何帮助? – JeremyP 2013-03-21 15:49:36

+0

我假设NETWORK_ERROR不完全是一个NSString对象,至少在编译时没有。这是itemStatus = [[DynamoDBManager getItem:itemID] retain]隐式调用方法,负责崩溃。 – 2013-03-21 16:52:51