2011-10-04 104 views
1

更新iPhone崩溃..没有控制台错误

我打开僵尸......而得到这个错误:

*** -[CALayer retain]: message sent to deallocated instance 0x709d1a0 

我遇到崩溃,不作任何感觉到我。在loadMediaList我正在编程创建多个按钮并为他们分配一个操作(openMedia:)。该行为具有“openURL”行为。一切都很好,直到行动被调用;该操作被执行,在新窗口中打开,但是一旦该应用退出就会崩溃。我用不同的代码替换了“openURL”代码,它仍然崩溃......想法?

在控制台中没有错误,我得到EXC_BAD_ACCESS。控制台说:

sharedlibrary apply-load-rules all Current language: auto; currently objective-c kill quit Program ended with exit code: 0

我一直在这个问题上几天,现在,我无法弄清楚。我的dealloc很棒,线程似乎运行良好,等等。我不知道这是否合法堆栈溢出,但我会很乐意支付一个人来帮助我解决这个问题。我有一个非常紧迫的期限。

希望你能帮助!

-(IBAction)showMedia:(id)sender { 
    NSLog(@"Media Button was pressed"); 

    //Begin Alert 
    [SVProgressHUD showInView:self.view status:@"Loading..."]; 

    mediaScroll.delegate = self; 
    mediaScroll.frame = CGRectMake(15, 60, 240, 185); 
    mediaScroll.clipsToBounds = YES; 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.4]; 

    statsBTN.frame = CGRectMake(272, 76, 48, 46); 
    donateBTN.frame = CGRectMake(272, 124, 48, 46); 
    shareBTN.frame = CGRectMake(272, 172, 48, 46); 
    mediaBTN.frame = CGRectMake(280, 220, 48, 46); 

    incViewPopUP.alpha = 0; 
    donViewPopUP.alpha = 0; 
    shareViewPopUP.alpha = 0; 
    mediaViewPopUP.alpha = 1; 

    [UIView commitAnimations]; 

    [self loadMediaList]; 

    [mediaBTN addTarget:self action:@selector(closePopUp:) forControlEvents:UIControlEventTouchUpInside]; 
    } 


-(void)loadMediaList { 
[self.productPointers removeAllObjects]; 

    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"date_reported" ascending:NO] autorelease]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
    NSArray *sortedArray = [finalMediaList sortedArrayUsingDescriptors:sortDescriptors]; 
    NSLog(@"Sorted Media Array: %@", sortedArray); 

    if (mediaLoaded == NO) { 

     NSDictionary *mediaPost; 
     for (mediaPost in sortedArray) { 

      NSDictionary *inside = (NSDictionary *)[mediaPost valueForKey:@"media"]; 
      NSLog(@"Inside Array: %@", inside); 

      UIButton *mediaView = [[UIButton buttonWithType:UIButtonTypeCustom] retain]; 
      mediaView.frame = CGRectMake(0, (mx * 100), 225, 100); 
      mediaView.backgroundColor = [UIColor clearColor]; 
      [mediaView addTarget:self action:@selector(openMedia:) forControlEvents:UIControlEventTouchUpInside]; 
      mediaView.titleLabel.hidden = YES; 
      mediaView.titleLabel.alpha = 0; 

      mx++; NSLog(@"MX: %i", mx); 


      UILabel *mediaDesc = [[UILabel alloc] init]; 
      mediaDesc.frame = CGRectMake(50, 20, 154, 40); 
      mediaDesc.backgroundColor = [UIColor clearColor]; 
      mediaDesc.font = [UIFont fontWithName:@"Geogrotesque" size:12]; 
      mediaDesc.textColor = UIColorFromRGB(0xc7c7c7); 
      mediaDesc.numberOfLines = 0; 
      mediaDesc.lineBreakMode = UILineBreakModeWordWrap; 
      mediaDesc.text = [inside valueForKey:@"description"]; 

      UILabel *mediaType = [[UILabel alloc] init]; 
      mediaType.frame = CGRectMake(50, 40, 154, 50); 
      mediaType.backgroundColor = [UIColor clearColor]; 
      mediaType.font = [UIFont fontWithName:@"Geogrotesque" size:12]; 
      mediaType.textColor = UIColorFromRGB(0xffffff); 
      mediaType.numberOfLines = 0; 
      mediaType.lineBreakMode = UILineBreakModeWordWrap; 
      mediaType.text = [[inside valueForKey:@"type"] uppercaseString]; 


      UIImageView *mediaBorder = [[UIImageView alloc] initWithFrame:CGRectMake(0, 99.0, 220.0, 1.0)]; 
      [mediaBorder setImage:[UIImage imageNamed:@"bottom_border.png"]]; 

      UIImageView *mediaArrow = [[UIImageView alloc] initWithFrame:CGRectMake(214.0, 45.0, 6.0, 9.0)]; 
      [mediaArrow setImage:[UIImage imageNamed:@"media_right_arrow.png"]]; 


      if ([mediaType.text isEqualToString:@"VIDEO"]) { 
       UIImageView *mediaThumb = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 35.0, 30.0, 30.0)] autorelease]; 
       [mediaThumb setImage:[UIImage imageNamed:@"media_play_icon.png"]]; 
       [mediaView addSubview:mediaThumb]; 
       [mediaThumb release]; 

       [mediaView setTag:1]; 
       [mediaView setTitle:[inside valueForKey:@"filename"] forState:UIControlStateNormal]; 
       } 

      if ([mediaType.text isEqualToString:@"IMAGE"]) { 
       UIImageView *mediaThumb = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 35.0, 30.0, 22.0)] autorelease]; 
       [mediaThumb setImage:[UIImage imageNamed:@"media_photo_icon.png"]]; 
       [mediaView addSubview:mediaThumb]; 
       [mediaThumb release]; 

       [mediaView setTag:2]; 
       [mediaView setTitle:[inside valueForKey:@"url"] forState:UIControlStateNormal]; 
       } 


      [mediaView addSubview:mediaArrow]; 
      [mediaView addSubview:mediaBorder]; 
      [mediaView addSubview:mediaDesc]; 
      [mediaView addSubview:mediaType]; 
      [mediaScroll addSubview:mediaView]; 
      [self.productPointers addObject:mediaView]; 

      [mediaArrow release]; 
      [mediaBorder release]; 
      [mediaType release]; 
      [mediaDesc release]; 
      [mediaView release]; 
     } 
    } 

    mediaLoaded = YES; 
    [mediaScroll setContentSize:CGSizeMake(225.0f, (mx * 100))]; 

    //End Alert 
    [SVProgressHUD dismiss]; 
    } 


-(IBAction)openMedia:(id)sender { 
    NSLog(@"Media opened!"); 

    NSString *tag = [NSString stringWithFormat:@"%d", [sender tag]]; 
    NSLog(@"Tag: %@", tag); 

    videoID = [sender currentTitle]; 

    NSString *videoURL = [[[NSString alloc] initWithFormat:@"http://www.vimeo.com/%@", videoID] autorelease]; 

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:videoURL]]; 
    NSLog(@"Video URL: %@", videoURL); 
    } 
+0

控制台中唯一的是“EXC_BAD_ACCESS”?调用堆栈?尽可能地发布信息。 – zaph

+0

控制台中有东西......但没有错误......我将它添加到我的问题中。 –

+0

将环境变量NSZombieEnabled设置为YES并查看它崩溃的位置。 – 0x8badf00d

回答

1

打开malloc stack loggingguard malloczombie enabled在调试器中,然后运行:

(gdb) info malloc-history 0x1b18b0 

0x1b18b0是具有坏访问错误的东西的地址。它应该给你更多关于你的代码在哪里的问题。

See this article for better instructions


此外,一些代码想法,可能帮助

改变这一点:

videoID = [sender currentTitle]; 
NSString *videoURL = [[[NSString alloc] initWithFormat:@"http://www.vimeo.com/%@", videoID] autorelease]; 
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:videoURL]]; 

要:

videoID = [sender currentTitle]; 
if (videoID) { 
    // no need to alloc then set autorelease, just used a named initializer since they autorelease by default: 
    NSString *videoURL = [NSString stringWithFormat:@"http://www.vimeo.com/%@", videoID]; 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:videoURL]]; 
} else { 
    // deal 
} 
+0

太棒了!僵尸回来这个错误:'*** - [CALayer保留]:消息发送到释放实例0x709d1a0' –

+0

如何运行'(gdb)info malloc-history 0x7d65cfd0'?我很困惑如何找到要搜索的堆栈。 –

+0

已修复!我有'mediaThumb'设置autorelease并释放...呃。 –