Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 不';在将VC添加为UINav rootVC时,不要将内存分配给IVR_Objective C_Ios_Memory Management - Fatal编程技术网

Objective c 不';在将VC添加为UINav rootVC时,不要将内存分配给IVR

Objective c 不';在将VC添加为UINav rootVC时,不要将内存分配给IVR,objective-c,ios,memory-management,Objective C,Ios,Memory Management,已编辑 这是我在编码过程中遇到的一个非常常见的问题,请看一下 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customi

已编辑

这是我在编码过程中遇到的一个非常常见的问题,请看一下

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.

// Adding Landing screen landscape on mainwindow
self.landingViewController = [[LandingViewController alloc] initWithNibName:@"LandingViewController" bundle:nil];
[self.window addSubview:self.landingViewController.view];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}

#导入
@类RecentPlanViewController;
@ChevronViewController类;
@界面着陆视图控制器:UIViewController
{
UINavigationController*导航控制器;
//自定义视图控制器
RecentPlanViewController*RecentPlanViewController;
ChevronViewController*ChevronViewController;
}
-(作废)popView:(NSNotification*)通知;
@属性(非原子,保留)UINavigationController*navigationController;
@属性(非原子,保留)RecentPlanViewController*RecentPlanViewController;
@属性(非原子,保留)ChevronViewController*ChevronViewController;
@结束
self.recentPlanViewController=[[recentPlanViewController alloc]initWithNibName:@“recentPlanViewController”捆绑包:nil];
[self.recentPlanViewController loadView];//如果跳过此项:未分配到recentPlanViewController的IVs的内存。
self.navigationController=[[UINavigationController alloc]initWithRootViewController:self.recentPlanViewController];
#进口
@类最近平面单元;
@接口RecentPlanViewController:UIViewController
{
IBMOutlet UITableView*recentPlanTableView;//主最近表视图
RecentPlanCell*RecentPlanCell;
IBUIButton*createPlanButton;
IBUIButton*viewAllPlanButton;
BOOL正在查看所有计划;//如果按“查看所有计划”,则为“是”
}
@属性(非原子,保留)RecentPlanCell*RecentPlanCell;
@属性(非原子,保留)IBUIButton*createPlanButton;
@属性(非原子,保留)IBUIButton*viewAllPlanButton;
@结束
以上编写的代码有两个结论

1.如果我使用loadView方法。它调出视图控制器的视图,并仅将内存分配给IBOutlets,而不分配给其他
self.recentPlanViewController
实例变量

2.如果我跳过第二行代码,即使将其用作rootVC,它也不会将内存分配给任何IVR

请指导我,我违反的内存管理概念是什么


谢谢

问题是,
加载视图
是自动调用的,您不应该自己调用它。要将其命名为您的
ui视图控制器
,必须显示在屏幕上。您现在拥有的是一个指向您的
recentPlanViewController
的指针。为了调用
loadView
viewDidLoad
view将出现
,您需要执行以下操作:

[self pushViewController:self.recentPlanViewController];
UIViewController
实际出现在屏幕上之前,您不应依赖您的
IBOutlets
。如果您想让您的
IBOutlets
在开头有一些默认值,您应该在
init
方法中传递它们,将它们保存为ivar,然后在
viewDidLoad
中设置它们

编辑:

这可能有问题:

self.navigationController = [[UINavigationController alloc] initWithRootViewController:self.recentPlanViewController ];
因为您正在重新初始化自己的navigationController

编辑2:

如果您只想显示新的
UIViewController
,假设您已经有一个工作的
UINavigationController
,您可以执行以下操作:

  [self.navigationController pushViewController:self.recentPlanViewController animated:YES];
[self presentViewController:self.recentPlanViewController animated:YES completion:^{

}];
如果您没有
self.navigationController
,则可以执行以下操作:

  [self.navigationController pushViewController:self.recentPlanViewController animated:YES];
[self presentViewController:self.recentPlanViewController animated:YES completion:^{

}];

有几个问题:

  • 您正在直接调用
    loadView
  • 您没有显示视图控制器的视图
loadView
报告说:

如果无法在序列图像板或nib文件中定义视图,请重写loadView方法以手动实例化视图层次结构并将其指定给视图属性

以及:

您不应直接调用此方法[loadView]。视图控制器在其视图属性被请求但当前为nil时调用此方法。此方法加载或创建视图,并将其指定给视图属性

这是什么意思? 有三种方法可以为视图控制器提供视图:

  • 使用故事板
  • 使用笔尖
  • 编程的
因此,由于您所说的是
IBOutlet
s,因此必须排除第三种方法

IBOutlet
s何时“准备就绪”? 输入
viewDidLoad

在视图控制器将其视图层次结构加载到内存后,将调用此方法。无论视图层次结构是从nib文件加载还是在loadView方法中以编程方式创建的,都会调用此方法

调用此方法后,您的
IBOutlet
s已准备就绪,您可以安全地访问它们

展示观点 我不知道视图控制器的层次结构是什么,但您可能正在重新分配
navigationController
,而不是重用它

如果从另一个视图控制器推送该视图控制器,则应执行以下操作:

[self.navigationController pushViewController:self.recentPlanViewController animated:YES];
为了重用管理层次结构(而不是重新分配层次结构)的
navigationController


因此,问题是:如何显示着陆视图控制器?

解决方法是:
关联或使用视图控制器本身中的IVAR。

否,因为尚未加载IBOUTPUTS。但别相信我。。。执行以下
NSLog(@“我的IBoutlet%@”,aooutlet)
并在
initWithRootViewController
上查看结果,Jacky,我可以将我的VC发布到NavigationController,但问题是:VC拥有的实例变量没有分配内存。这样我就可以对它执行一些操作。我承认不需要显式调用
loadView
,但在推送VC或以root身份添加时..对我不起作用!!检查我的编辑。告诉我你想用你的
recentPlanViewController做什么
我也编辑了我的代码。按下
recentPlanViewController
后,我想在我的iboutlet上执行一些操作,如打开
createPlanButton