iOS如何确定发送了哪些对象didReceiveMemoryWarning消息?

| 我正在开发一个iPhone应用程序,在该应用程序中,许多UIView是动态添加到主UIWindow和从其中删除的。 在模拟器中模拟内存不足错误时,我发现并非所有视图控制器都收到didReceiveMemoryWarning通知。不幸的是,这些控制器将最受益于实现此方法。 我似乎找不到有关在何处以及如何调用该方法的良好信息。我读过提到它被发送到“所有UIViewControllers”的消息,但事实并非如此。在确实能收到通知的一个类中添加断点也没有特别启发。 这是一个复杂的项目,但是添加这些视图的一种方式是:
- (void) showMyView
{
  if(!myViewController){
    myViewController = [[MyViewController alloc]init];
    [window addSubview:myViewController.view];
  }
}
MyViewController是另一个类MySuperViewController的子类,而MySuperViewController本身是UIViewController的子类。这些类别都没有对应的NIB;视图层次结构以编程方式创建。 我正在寻找有关如何诊断问题的指示。     
已邀请:
        当您直接使用controller1的视图控制器时,很有可能您的视图控制器不会收到很多通知,因为这不是使用视图控制器的正确方法。
UIWindow
是特例,因为窗口可以自动知道视图的控制器并将消息正确定向到控制器。 但是,当您从
UIWindow
分离视图时,视图控制器也会被分离,并且不再由ѭ2managed进行管理。我认为这是问题的根源。 我建议您添加一个导航控制器或选项卡栏控制器作为您的根视图控制器,并使用该视图控制器功能在子控制器之间切换。请注意,切换时不应删除视图控制器,这样它们将能够正确接收消息。 如果视图控制器的初始化很简单并且不占用太多时间,则您还可以考虑在不使用视图控制器时释放它。     
        在代码中的某处,您可能正在执行以下操作:
[[NSNotificationCenter defaultCenter] removeObserver:self];
唯一安全的地方是6英镑。 在其他任何地方,您都应指定要取消注册的通知(如果您注册与superlcass相同的通知,则仍然有可能中断)。     
        从文档中   默认实现   [didReceiveMemoryWarning]检查以   查看视图控制器是否可以安全地   发表看法。如果有可能   该视图本身没有   超级观看,可以重新加载   从笔尖文件或使用自定义   loadView方法。 模拟“内存警告” /“发生”时调用此方法。当内存不足时,系统可能会发布通知,并且视图控制器通过调用ѭ7来响应通知。 如果不重写该方法,则会调用默认实现(如上所述)。内存中的所有视图控制器都会收到“内存警告”并调用此方法。如果释放视图不是“安全”的,他们只是不做任何事情。 在带有导航控制器的简单测试应用程序中,在当前视图控制器和先前显示的控制器中,都将调用“ 7”。我不知道
NSNotificationCenter
的工作原理,但知道谁注册了
UIApplicationDidReceiveMemoryWarningNotification
。它可能是这样设置的:
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(didReceiveMemoryWarning)
                                             name:UIApplicationDidReceiveMemoryWarningNotification  
                                           object:nil];
有关更多信息,您可以查看UIViewController类参考中的“内存管理”部分。     
        我输入了这个问题,寻找处理内存警告的合适观察者。对于使用swift的用户,可以按以下步骤注册:
NSNotificationCenter.defaultCenter().addObserver(self, selector: \"didReceiveMemoryWarning:\", name:UIApplicationDidReceiveMemoryWarningNotification, object: nil)
使用回调方法:
func didReceiveMemoryWarning(notification: NSNotification){
    //Action take on Notification
}
另外,请确保您的自定义类继承自NSObject,否则您将收到此错误:
… does not implement methodSignatureForSelector: — trouble ahead
    

要回复问题请先登录注册