MPMusicPlayerController函数停止导致崩溃

时间:2010-08-13 02:53:37

标签: iphone

我使用下面的代码播放ipod音频库。

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 个答案:

答案 0 :(得分:1)

你发布了playa并且它被释放了。如果musicPlaya是保留属性,则只能在使用

时访问set消息
  self.musicPlayer = playa;

您稍后使用musicPlayer执行了相同的操作 - 您调用的方法返回了一个自动释放的对象。您需要保留它 - 可能是通过self.musicPlayer语法使用set消息。

找到这样的问题的最简单方法是运行构建和分析 - 我很确定它会将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中。 @property行生成了两条消息:getmusicPlayer和setmusicPlayer。你可以用

  [self setmusicPlayer: playa]

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

仅使用musicPlayer而没有自我绕过设置消息(和保留)并直接分配给实例变量。

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

 @interface ClassName : NSObject
 {
     MPMusicPlayerController* _musicPlayer;
 }

 @property(retain, nonatomic) MPMusicPlayerController* musicPlayer;

然后

 @synthesize musicPlayer = _musicPlayer;

然后,始终使用self.musicPlayer进行分配,以确保获得保留。如果你不小心离开了自己,你就会遇到编译错误。