问题描述
|
我对此完全没有主意...我尝试了太多变化以至于头晕目眩...
我有一个主UIViewController,只需按一下按钮,即可将另一个UIViewController添加到其子视图之一。添加动态UIVC后,将更新主UIVC中的属性以保留对其的引用(称为currentObject)。一切正常。
我遇到的问题是,如果添加另一个动态UIVC,则保存引用的属性最初会正确更新,但是无论我尝试什么,当我触摸第一个动态UIVC时都无法更新该属性。我尝试从动态UIVC设置\“ currentObject \”的所有操作都会给我一个\“无法识别的选择器发送给class \”错误,然后失败。
我一开始不打算将代码放入这篇文章。不知道我会发布什么会有所帮助。
提前致谢!
更新:
在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
的先前值。您似乎并未从mainView
中删除先前的currentObject
的视图。我怀疑您将ѭ2设置为自动释放的对象,由于绕过了setter而未能保留它,并最终尝试向释放的对象发送消息,导致消息“ \\无法识别的选择器\”错误,因为您的消息到达其他任何地方当您尝试引用一个不再存在的对象时,该对象现在占用了内存地址或BAD_ACCESS错误。
self.currentObject = foo
等同于[self setCurrentObject:foo]
,可能正是您想要的。
, 如何使用委托模式?