我使用下面的代码播放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中
答案 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
进行分配,以确保获得保留。如果你不小心离开了自己,你就会遇到编译错误。