如何在appdelegate中获取指向viewcontroller对象的指针

时间:2011-12-29 20:18:38

标签: iphone ios xcode4.2

我正在尝试告诉一个CLLocationManager对象,它是一个viewcontroller的属性,当appDelegate收到应用程序将进入后台的消息时,我不知道如何引用我的appDelegate类中的viewController对象。

2 个答案:

答案 0 :(得分:2)

听起来你采取了错误的做法。由于位置管理器是视图控制器上的实例变量,因此它应该是视图控制器指示它停止 - 而不是应用程序委托。

这就是Cocoa / UIKit / Objective-C的设计工作方式,其他任何事情都是一场艰苦的战斗。

在viewController中可能是这样的:

@implementation MyViewController

- (id)init
{
  ...

  self.locationManager = [[CLLocationManager alloc] init];
  locationManager.delegate = self;
  [self.locationManager startUpdatingLocation];

  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];

  ...
}

- (void)dealloc
{
  [self.locationManager stopUpdatingLocation];
  [[NSNotificationCenter defaultCenter] removeObserver:self];

  ...
}

- (void)applicationWillEnterForeground:(NSNotification *)notif
{
  [self.locationManager startUpdatingLocation];
}


- (void)applicationDidEnterBackground:(NSNotification *)notif
{
  [self.locationManager stopUpdatingLocation];
}

@end

但要回答您的具体问题,您可以在视图控制器中使用此功能访问应用代理:

[UIApplication sharedApplication].delegate

这将让你告诉它有关视图控制器的信息。但要小心,因为你可能会造成内存泄漏!

您需要确保委托不保留视图控制器,否则永远不会取消分配。并且您需要确保在取消分配视图控制器时,委托对视图控制器的引用设置为nil。

一般来说,你应该避免让app delegate对任何特定的视图控制器都有所了解。

答案 1 :(得分:0)

当app即将进入后台时,viewcontroller中是否未调用viewWillDisappear委托方法?