2012-08-29 18 views
0

在我目前正在使用的单视图iOS应用程序中,我有一个视图控制器,用于管理音频流的播放,以及一系列用于播放控制的UI元素,滚动等...为了清楚起见,我们将其称为AudioStreamerViewControllerUITableView在rowselect上多次设置parentView属性

此视图中的“曲目选择”按钮连线到某个动作时,会以模态方式显示TrackSelectionTableViewController,目的是允许用户选择曲目并在调用tableView:didSelectRowAtIndexPath:时返回播放视图。
当此行选定的方法触发时,目标是在AudioStreamerViewController中消息代理回调方法,然后尝试执行self.currentTrack = trackObjPassedToCallback

的问题是AudioStreamerViewController调用它currentTrack二传手的时间看似无限数量(类似“我必须停止模拟器或我会遇到内存不足”的次数),而我似乎无法找出原因。调用堆栈的I took a screenshot。它有一个断点设置成只显示图像在七个电话,但相信我,它会继续下去,=)

我连线两个ViewControllers起来使用以下原型制作AudioStreamerViewControllerTrackSelectionTableViewController的委托:

// 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... 
} 

我试图做这多种方式,和他们每个人都产生相同的最终结果。任何人都可以识别为什么会发生这种情况的任何指标?另外,是否有一个更具吸引力/稳定的方法来实现这个想法?如果是这样,有什么好处?

回答

0

答案在你的堆栈跟踪中。 -setCurrentTrack:正在呼叫-setCurrentTrack:。你的代码是-setCurrentTrack:

+0

是的。在添加currentTracks属性之前存在的名为-setCurrentTrack的旧setter在AudioStreamerViewController.h中注释掉,而不在.m文件中。其实现将覆盖currentTrack属性的合成设置器,并创建一个调用链,以便将其自身路由回去。粗心的重构导致了粗心的错误,并且代码不应该在那里出现,更不用说注释了=) –