从动态实例化的类objective-c设置主视图控制器中的property值

问题描述

| 我对此完全没有主意...我尝试了太多变化以至于头晕目眩... 我有一个主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]
,可能正是您想要的。     ,        如何使用委托模式?     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...