我对此完全没有主意...我尝试了太多变化以至于头晕目眩...

我有一个主UIViewController,只需按一下按钮,即可将另一个UIViewController添加到其子视图之一。添加动态UIVC后,将更新主UIVC中的属性以保留对其的引用(称为currentObject)。一切正常。

我遇到的问题是,如果添加另一个动态UIVC,则保存引用的属性最初会正确更新,但是无论我尝试什么,当我触摸第一个动态UIVC时都无法更新该属性。我尝试从动态UIVC设置“ currentObject”的所有操作都会给我一个“无法识别的选择器,该选择器发送给类”错误,然后失败。

我一开始不打算将代码放入这篇文章。不知道我会发布什么会有所帮助。

提前致谢!

更新:

在DynamicModuleViewController.h中:

@interface DynamicModuleViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIPopoverControllerDelegate, UIGestureRecognizerDelegate, UITextViewDelegate, UIApplicationDelegate, MFMailComposeViewControllerDelegate>{

DynamicModule *currentObject;

}

@property(nonatomic, retain) DynamicModule *currentObject;


在DynamicModuleViewController.m中:

@implementation DynamicModuleViewController

@synthesize currentObject;

-(void)addObject:(id)sender
{
DynamicModule *dm = [[DynamicModule alloc]init];
// positioning and PanGesture recognition code to allow dragging of module
currentObject = dm;
[mainView addSubview:currentObject.view];
}

@end


以这种方式添加后,只需轻按一下按钮,效果就会很好。

一旦实例化了更多DynamicModule,就需要使用最后点击的DynamicModule更新currentObject。

最佳答案

将另一个UIViewController添加到其子视图之一


首先,这对我来说是一个危险信号。将UIViewController的视图添加为子视图几乎总是错误的方式来管理视图层次结构,这是iOS应用程序中的常见错误。请参阅http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/,这样我就可以继续关注主题,避免重复自己。


  currentObject = dm;


这将设置ivar直接支持您的currentObject属性。您正在泄漏currentObject的先前值。您似乎没有从currentObject中删除​​先前的mainView视图。我怀疑您将currentObject设置为自动释放的对象,由于绕过了setter而未能保留它,并最终尝试向释放的对象发送消息,导致消息出现“无法识别的选择器”错误,因为消息到达其他任何地方当您尝试引用一个不再存在的对象时,该对象现在占用该内存地址或BAD_ACCESS错误。

self.currentObject = foo等效于[self setCurrentObject:foo],可能正是您想要的。

08-17 17:03