具有错误访问崩溃的NSInvocationOperation

时间:2012-07-10 09:50:16

标签: objective-c memory-management nsinvocationoperation

我遇到了NSInvocationOperation的大问题。当我在我的iPod 4,固件5.0.1上运行时,没关系。但在我的iPhone 4,iOS 4.1上,它崩溃了。这是我的代码:

CustomAnnotation *annotation = [[[ModelManager defaultModelManager] getAnnotationDictionaryInMemory] objectForKey:joltId];

if (annotation == nil)
   annotation = [[[ModelManager defaultModelManager] getAnnotationDictionaryInMemory] annotationWithInstagramId:eID];

if (annotation == nil)
    continue;
 //THIS ONE CRASH ON IPHONE 4 OS 4.1
NSDictionary *param = [[NSDictionary alloc] initWithObjectsAndKeys: @"aKey", @"aValue", nil];

NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:annotation selector:@selector(updateAnnotation:) object:param];

[_queue addOperation:op];
[op autorelease];

updateAnnotation函数在CustomAnnotation类中定义:

- (void)updateAnnotation:(id)sender {
//NSLog(@"UPDATE ANNOTATION ID: %@", self.annoID);
NSDictionary *senderDic = (NSDictionary *)sender;
UzooltAppDelegate* appDelegate = (UzooltAppDelegate*) [UIApplication sharedApplication].delegate;

if ([senderDic objectForKey:@"nb_rejolt"] != nil) {
    NSInteger new_nb_rejolts = [[senderDic objectForKey:@"nb_rejolt"] intValue];
    //if (new_nb_rejolts != rejolts) {
        //NSLog(@"update nb rejolts: %d", new_nb_rejolts);

        if (self.rejolts != new_nb_rejolts) {
            self.rejolts = new_nb_rejolts;
            //if (self.isGrouped)
            //    [self.masterAnnotation.annotationView performSelectorOnMainThread:@selector(updateAnnotationViewWithRejolts:) withObject:[NSString stringWithFormat:@"%d", rejolts] waitUntilDone:NO];
            //else

            if ([senderDic objectForKey:@"rejolt_fbid"] != nil) {
                NSString *fbRejoltsString = [senderDic objectForKey:@"rejolt_fbid"];
                self.fbRejolts = [[fbRejoltsString componentsSeparatedByString:@","] mutableCopy];
                [self.fbRejolts removeLastObject];
                [self updateNumberOfRejoltsFromFBFrds];
            }

            [self.annotationView performSelectorOnMainThread:@selector(updateAnnotationViewWithRejolts:) withObject:[NSString stringWithFormat:@"%d", rejolts] waitUntilDone:NO];
        }

        if (self.isGrouped) {
            if (self.masterAnnotation.isShowingRadius == NO && appDelegate.uMainViewController.isInGroup == NO && ( new_nb_rejolts > self.masterAnnotation.rejolts || (new_nb_rejolts == self.masterAnnotation.rejolts && self.getAge < self.masterAnnotation.getAge))) {
                [self.masterAnnotation removeFromGroupedAnnotations:self];
                self.annotationView.hidden = NO;
                [self.annotationView performSelectorOnMainThread:@selector(showWithAlpha:) withObject:[NSNumber numberWithFloat:annotationAlpha] waitUntilDone:NO];
                [[NSNotificationCenter defaultCenter] postNotificationName:@"need_group_annotations" object:nil];
            }
        }
    //}
}

if ([senderDic objectForKey:@"lifetime"] != nil) {
    float new_lifetime = [[senderDic objectForKey:@"lifetime"] floatValue]*3600;
    //NSLog(@"new lifetime: %.f", new_lifetime);
    if (new_lifetime != lifetime) {
        //NSLog(@"update lifetime");
        self.lifetime = new_lifetime;
    }
}

[self updateViewAlpha];

if ([senderDic objectForKey:@"radius"] != nil) {
    float new_radius = [[senderDic objectForKey:@"radius"] floatValue];
    if (new_radius != radius) {
        //NSLog(@"update lifetime");
        self.radius = new_radius;
    }
}

/*
if ([appDelegate.uMainViewController isMaximumZoomIn])
    [[self annotationView] performSelectorOnMainThread:@selector(setGroupNumberIndicatorVisible:) withObject:[NSNumber numberWithBool:YES] waitUntilDone:NO];
else
    [[self annotationView] performSelectorOnMainThread:@selector(setGroupNumberIndicatorVisible:) withObject:[NSNumber numberWithBool:NO] waitUntilDone:NO];
*/

if (isSelected == YES && isShowingRadius == NO ) {
    //NSLog(@"update details");
    [self performSelectorOnMainThread:@selector(updateDetailsView) withObject:nil waitUntilDone:NO];

    UzooltAppDelegate* appDelegate = (UzooltAppDelegate*) [UIApplication sharedApplication].delegate;
    if (isGrouped == YES && appDelegate.uMainViewController.isInGroup) {
        NSLog(@"grouped jolt rejolted");
        [self performSelectorOnMainThread:@selector(updateInGroupAnnotationView) withObject:nil waitUntilDone:NO];
    }
}

}

我不知道哪里错了?请帮我。谢谢大家!!!

1 个答案:

答案 0 :(得分:0)

尝试在启用NSZombies的情况下运行。它应该至少给你一个提示,说明你在解除分配后试图访问的对象。

NSZombies enabled, debug information