我正在为我的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 +
答案 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]
而你不必担心保留它等等。