我可以为NSNotifications注册课程吗?我可以在NSNotifications中使用类方法吗?

时间:2012-02-15 21:41:49

标签: iphone objective-c notifications selector

我正在为我的iPhone应用程序上课,我希望它注册并了解应用程序状态更改(UIApplicationDidEnterBackgroundNotification等)。有没有办法为通知注册一个类,而不必将实例化的对象保留在内存中?我只想让相应的通知将类调用为init,做一些事情,然后再次留下内存。

现在我在init方法中有以下内容:

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

和此方法在类的.m文件中的其他位置:

- (void) handleEnteredBackground {
    NSLog(@"Entered Background"); }

我在applicationDidLoad下实例化了一次类,​​但由于我没有对它做任何事情,我认为ARC从内存中杀死了对象,当我走的时候应用程序崩溃(没有任何有用的错误代码,请注意)关闭它。如果我将handleEnteredBackground切换为带有“+”符号的类方法,则在关闭应用时会出现无效的选择器错误。

最终目标是在应用程序的生命周期中实例化一次类,并使其能够响应应用程序状态更改,而无需在类外部添加任何其他代码。假设iOS 5 + Xcode 4.2 +

2 个答案:

答案 0 :(得分:19)

以下内容应该有效:

[[NSNotificationCenter defaultCenter] addObserver: [self class]
                                         selector: @selector(handleEnteredBackground:) 
                                             name: UIApplicationDidEnterBackgroundNotification
                                           object: nil];

选择器本身:

+ (void) handleEnteredBackground: (NSNotification *) notification
{
}

您不必取消注册观察者,因为无法取消分配或以其他方式销毁类对象。如果您出于其他原因需要取消注册观察者,您可以:

[[NSNotificationCenter defaultCenter] removeObserver: [self class]];

答案 1 :(得分:3)

你应该研究singletons

您可以轻松创建一个持续整个应用程序生命周期的对象。

+ (id)sharedObserver
{
    static dispatch_once_t once;
    static YourObserverClass *sharedObserver = nil;

    dispatch_once(&once, ^{ 
        sharedObserver = [[self alloc] init]; 
    });

    return sharedObserver;
}
- (void)startObserving
{
    // Add as observer here
}

现在你可以致电[[YourObserverClass sharedObserver] startObserving]而你不必担心保留它等等。