2011-10-04 105 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並釋放...呃。 –