0

在我目前正在开发的单视图 iOS 应用程序中,我有一个视图控制器,旨在管理音频流的播放,以及一系列用于播放控制、滚动等的 UI 元素......为了清晰度,我们称之为AudioStreamerViewController

此视图中的“曲目选择”按钮连接到显示模式的操作,目的是允许用户选择曲目并在被调用TrackSelectionTableViewController时返回播放视图。 当此行选择方法触发时,目标是向委托回调方法发送消息,然后尝试执行。 tableView:didSelectRowAtIndexPath:
AudioStreamerViewControllerself.currentTrack = trackObjPassedToCallback

问题是AudioStreamerViewController调用它的currentTracksetter 似乎无限次(比如“我必须停止模拟器,否则我会用完内存”的次数),我似乎无法弄清楚为什么。 我截取了调用堆栈的屏幕截图。它设置了一个断点,所以它只在图像中显示了七个调用,但相信我,它会继续运行 =)

我通过使用以下原型制作 ' 代表来连接两个AudioStreamerViewControllerViewController TrackSelectionTableViewController

// in TrackSelectionTableViewController.h

@interface TrackSelectionTableViewController : UITableViewController {
    NSMutableArray *tracks;    
}
@property (nonatomic, assign) id<TrackSelectionTableViewControllerDelegate> delegate;

@protocol 
// in TrackSelectionTableViewController.m
@synthesize delegate;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  {
      Track *trackSelected = [tracks objectAtIndex:[indexPath row]];
      [self.delegate userDidSelectTrackFromTableView:trackSelected ];
      [self dismissModalViewControllerAnimated:YES];
  }

AudioStreamerViewController的原型和委托回调如下所示:

// in AudioStreamerViewController.h
@interface AudioStreamerViewController : UIViewController <SCDJTrackSelectionViewControllerDelegate> {
    Track *currentTrack;
}
@property (nonatomic) Track *currentTrack;

-(void)userDidSelectTrackFromTableView:(id)trackObj;

// in AudioStreamerViewController.m
@synthesize currentTrack;
-(void)userDidSelectTrackFromTableView:(id)trackObj
{
    self.currentTrack = (Track *)trackObj;
    // other handling code...
}

我尝试了多种方法,并且每种方法都产生相同的最终结果。任何人都可以确定为什么会发生这种情况的任何迹象吗?此外,是否有更有吸引力/更稳定的方法来实现这个想法?如果是这样,有什么好处?

4

1 回答 1

0

答案在您的堆栈跟踪中。-setCurrentTrack:正在打电话-setCurrentTrack:。你的代码是干什么用的-setCurrentTrack:

于 2012-08-29T02:35:51.063 回答