0

所有,在viewDidLoad中異步加載聲音資源崩潰

我試圖當我加載一個UIViewController異步加載一組聲音。幾乎在同一時間,我偶爾也會在我的ViewController層次結構的頂部放置一個UIView,以顯示一個幫助覆蓋。當我這樣做時,應用程序崩潰與一個壞的執行。如果未添加視圖,則該應用不會崩潰。我的視圖控制器看起來是這樣的:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    __soundHelper = [[SoundHelper alloc] initWithSounds]; 

    // Other stuff 
} 

- (void)viewDidAppear:(BOOL)animated 
    { 
    // ****** Set up the Help Screen 
    self.coachMarkView = [[FHSCoachMarkView alloc] initWithImageName:@"help_GradingVC" 
                coveringView:self.view 
                withOpacity:0.9 
                dismissOnTap:YES 
                withDelegate:self]; 

    [self.coachMarkView showCoachMarkView]; 
    [super viewDidAppear:animated]; 
} 

SoundHelper主要異步加載方法(從「initWithSounds」的稱呼)看起來是這樣的:

// Helper method that loads sounds as needed 
- (void)loadSounds { 

    // Run this loading code in a separate thread 
    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
    NSBlockOperation *loadSoundsOp = [NSBlockOperation blockOperationWithBlock:^{ 
     // Find all sound files (*.caf) in resource bundles 
     __soundCache = [[NSMutableDictionary alloc]initWithCapacity:0]; 

     NSString * sndFileName; 
     NSArray *soundFiles = [[NSBundle mainBundle] pathsForResourcesOfType:STR_SOUND_EXT inDirectory:nil]; 

     // Loop through all of the sounds found 
     for (NSString * soundFileNamePath in soundFiles) { 
      // Add the sound file to the dictionary 
      sndFileName = [[soundFileNamePath lastPathComponent] lowercaseString]; 
      [__soundCache setObject:[self soundPath:soundFileNamePath] forKey:sndFileName]; 
     } 

     // From: https://stackoverflow.com/questions/7334647/nsoperationqueue-and-uitableview-release-is-crashing-my-app 
     [self performSelectorOnMainThread:@selector(description) withObject:nil waitUntilDone:NO]; 
    }]; 
    [operationQueue addOperation:loadSoundsOp]; 
} 

崩潰似乎發生塊退出時。的FHSCoachMarkViewinit看起來是這樣的:

- (FHSCoachMarkView *)initWithImageName:(NSString *) imageName 
          coveringView:(UIView *) view 
          withOpacity:(CGFloat) opacity 
          dismissOnTap:(BOOL) dismissOnTap 
          withDelegate:(id<FHSCoachMarkViewDelegate>) delegateID 
{ 
    // Reset Viewed Coach Marks if User Setting is set to show them 
    [self resetSettings]; 

    __coveringView = view;   
    self = [super initWithFrame:__coveringView.frame]; 
    if (self) { 
     // Record the string for later reference 
     __coachMarkName = [NSString stringWithString:imageName]; 
     self.delegate = delegateID; 

     UIImage * image = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"png"]]; 

     // ****** Configure the View Hierarchy 
     UIImageView *imgView = [[UIImageView alloc] initWithImage:image]; 

     [self addSubview:imgView]; 
     [__coveringView.superview insertSubview:self aboveSubview:__coveringView]; 

     // ****** Configure the View Hierarchy with the proper opacity 
     __coachMarkViewOpacity = opacity; 
     self.hidden = YES; 
     self.opaque = NO; 
     self.alpha = __coachMarkViewOpacity; 

     imgView.hidden = NO; 
     imgView.opaque = NO; 
     imgView.alpha = __coachMarkViewOpacity; 

     // ****** Configure whether the coachMark can be dismissed when it's body is tapped 
     __dismissOnTap = dismissOnTap; 

     // If it is dismissable, set up a gesture recognizer 
     if (__dismissOnTap) { 
      UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self 
                         action:@selector(coachMarkWasTapped:)]; 
      [self addGestureRecognizer:tapGesture]; 
     } 
    } 
    return self; 
} 

我試圖調用同時使用NSBlockOperationdispatch_async異步塊都產生了相同的結果。另外,我已經完全刪除了aysnch調用,並在主線程上加載了聲音。這工作正常。我也嘗試了@Jason建議的解決方案:NSOperationQueue and UITableView release is crashing my app,但同樣的事情也發生在那裏。

這實際上是在FHSCoachMarkView中添加視圖的問題,還是它可能與訪問mainBundle?我在iOS中對異步編碼有點新,所以我有點不知所措。任何幫助,將不勝感激!

感謝, 斯科特

回答

0

我想通了這一點:我已經建立了SoundHelper對象(NSUserDefaultsDidChangeNotification),其時聽了NSUserDefaults的改變爲一個監聽器,並加載的聲音,如果用戶默認指示等等。 FHSCoachMarkView也在對NSUserDefaults進行更改。在SoundHelper中,我沒有正確地檢查哪些默認值正在更改,所以每次更改時都會調用異步聲音加載方法。所以多線程試圖修改__soundCache實例變量。它似乎並不那樣。

問題:這是回答你自己問題的正確方法嗎?或者,我是否應該只爲自己的問題添加評論?

謝謝。