我有两个属性设置为ViewControllers,每个属性使用不同的NIB文件。 (男性和女性模型,功能相同,但设置视觉上不同。)我想有一个函数来创建基于我传入的NIB名称和ViewController的ViewController。
发生的事情是ViewController属性未被保留。如果我在函数中添加实际的属性名称并进行设置,则会设置viewController并保留ViewController。这是我在.m文件中的内容(仅显示获得帮助所需的内容。)我保留了两条注释行,我试图确定问题所在。
@synthesize femaleModelViewController;
@synthesize maleModelViewController;
- (void) loadModelViewControllerWithModelType:(NSString*) model ModelView:(ModelViewController *)modelViewController {
ModelViewController *viewController = [[ModelViewController alloc] initWithNibName:model bundle:nil];
// [self setFemaleModelViewController:viewController]; // I don't want to set the property here, I want to be able to pass it as an argument.
modelViewController = viewController;
// [modelViewController retain]; // I even tried to retain it do see if would but it doesn't.
[viewController release];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self loadModelViewControllerWithModelType:@"FemaleModel" ModelView:femaleModelViewController];
[self loadModelViewControllerWithModelType:@"MaleModel" ModelView:maleModelViewController];
}
在.h文件中,我的属性设置如下:
@property (nonatomic, retain) ModelViewController *femaleModelViewController;
@property (nonatomic, retain) ModelViewController *maleModelViewController;
答案 0 :(得分:0)
您是否尝试将新ModelViewController
分配给maleModelViewController
和femaleModelViewController
?如果是这样的话,那你就错了。
坦率地说,我完全取消了loadModelViewControllerWithModelType:modelView:
方法。你需要在viewDidLoad
中做的就是:
maleModelViewController = [[ModelViewController alloc] initWithNibName:@"MaleModel"];
femaleModelViewController = [[ModelViewController alloc] initWithNibName:@"FemaleModel"];
(这假设maleModelViewController
和femaleModelViewController
是支持同名属性的实例变量。)
当您传入maleModelViewController
和femaleModelViewController
时,您没有传递对这些变量的引用,而是传递了它们的值。由于它们尚未初始化,您所做的只是传递nil
。要执行您要执行的操作,您需要将指针传递给变量(即将参数声明为ModelViewController **
,并将其作为&maleModelViewController
传递给&femaleModelViewController
并使用*modelViewController = viewController
进行分配。如果您习惯使用C#或Java等传递引用友好语言,那么您应该阅读它在C中的工作方式。(规则是在Objective-C中与在C)中相同。
然而,对于你在这里尝试做的事情,这仍然是完全矫枉过正的。
此外,您的代码仍然无效,因为您转身并发布viewController
。这将导致它立即被释放,因为你唯一的参考来自你alloc
编辑它。您将分配一个死引用,一旦您尝试使用它就会使程序崩溃。