代码之家  ›  专栏  ›  技术社区  ›  arachide

MPMusicLayerController功能停止导致崩溃

  •  0
  • arachide  · 技术社区  · 14 年前

    if( musicPlayer==nil)
    {
    
        MPMusicPlayerController* playa=[[MPMusicPlayerController alloc]init];
    
        musicPlayer=playa;
        [ playa release];
    }
    
     musicPlayer = [MPMusicPlayerController applicationMusicPlayer];
     [musicPlayer setShuffleMode: MPMusicShuffleModeOff];
     [musicPlayer setRepeatMode: MPMusicRepeatModeNone];
     [musicPlayer setQueueWithItemCollection: userMediaItemCollection];
     [musicPlayer play];
    

    -(void)stopMusicPlayer;
    {
    
       if (playbackState == MPMusicPlaybackStatePlaying) {
            [ musicPlayer stop];
       }    
    
    
    }
    

    但它会崩溃然后退出。

    欢迎评论

    interdev公司

    1 回复  |  直到 14 年前
        1
  •  1
  •   Lou Franco    14 年前

    你释放了普拉亚,它被释放了。如果musicPlaya是保留属性,则仅在使用时访问设置消息

      self.musicPlayer = playa;
    

    你后来也做了同样的事 musicPlayer --您调用的方法返回了一个自动释放的对象。您需要保留它——可能是通过使用set消息 self.musicPlayer 语法。

    找到这样的问题最简单的方法是运行一个构建和分析——我很确定它会标记playa被发布太多次。另一个好方法是使用NSZombiesEnabled,我在博客中描述了如何使用它(参见技巧1)

    http://www.loufranco.com/blog/files/debugging-memory-iphone.html

    更新:进一步解释:

     MPMusicPlayerController* musicPlayer;
    

     @property (retain, nonatomic) MPMusicPlayerController* musicPlayer;
    

    在以后的代码中,您可能会认为

     musicPlayer = playa;
    

    与相同

     self.musicPlayer = playa;
    

    因为java、C++和C语言(和其他语言)中的等价物是。这是不一样的。

    在Objective-C中,@属性行生成了两条消息,getMusicLayer和setMusicLayer。你可以用

      [self setmusicPlayer: playa]
    

    这会自动为你保留playa。 self.musicPlayer = playa 是它的同义词。

    使用just

    你可以这样做来避免这种情况

     @interface ClassName : NSObject
     {
         MPMusicPlayerController* _musicPlayer;
     }
    
     @property(retain, nonatomic) MPMusicPlayerController* musicPlayer;
    

    然后

     @synthesize musicPlayer = _musicPlayer;
    

    self.music播放器 以确保获得保留。如果你不小心漏掉了self,你会得到一个编译器错误。