iOS 作为单例的 AppDelegate 无法 return 同一个实例
iOS AppDelegate as singleton failed to return same instance
我尝试将我的 AppDelegate 设为单例并通过我的应用程序访问它:
AppDelegate.h
/.../
@interface AppDelegate : UIResponder <UIApplicationDelegate>
+(AppDelegate*)sharedAppDelegate;
@end
AppDelegate.m
#import AppDelegate.h
/.../
@implementation AppDelegate
AppDelegate *sharedAppDelegate;
+ (AppDelegate *)sharedAppDelegate{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedAppDelegate = [[self alloc] init];
});
NSLog(@"shared app: %@",sharedAppDelegate)
return sharedAppDelegate;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"launched app: %@",self);
}
MyClass.m
#import AppDelegate.h
/.../
- (void)viewDidLoad{
[super viewDidLoad];
NSLog(@"app in myClass: %@",[AppDelegate sharedAppDelegate]);
}
控制台中的日志:
[***]launched app: <AppDelegate: 0x78757810>
[***]shared app: <AppDelegate: 0x78f39760>
[***]app in myClass: <AppDelegate: 0x78f39760>
为什么发布的和分享的不一样?
我不是真的把AppDelegate做成了单例吗?
在 +sharedAppDelegate
中,您正在分配 AppDelegate
class 的新实例。相反,您想要的是在应用程序启动时捕获 UIApplication
为您创建的实例。最简单的方法是使用 sharedApplication
单例,它已经存储了委托实例:
+ (AppDelegate *)sharedAppDelegate {
return [[UIApplication shareApplication] delegate];
}
我尝试将我的 AppDelegate 设为单例并通过我的应用程序访问它:
AppDelegate.h
/.../
@interface AppDelegate : UIResponder <UIApplicationDelegate>
+(AppDelegate*)sharedAppDelegate;
@end
AppDelegate.m
#import AppDelegate.h
/.../
@implementation AppDelegate
AppDelegate *sharedAppDelegate;
+ (AppDelegate *)sharedAppDelegate{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedAppDelegate = [[self alloc] init];
});
NSLog(@"shared app: %@",sharedAppDelegate)
return sharedAppDelegate;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"launched app: %@",self);
}
MyClass.m
#import AppDelegate.h
/.../
- (void)viewDidLoad{
[super viewDidLoad];
NSLog(@"app in myClass: %@",[AppDelegate sharedAppDelegate]);
}
控制台中的日志:
[***]launched app: <AppDelegate: 0x78757810>
[***]shared app: <AppDelegate: 0x78f39760>
[***]app in myClass: <AppDelegate: 0x78f39760>
为什么发布的和分享的不一样?
我不是真的把AppDelegate做成了单例吗?
在 +sharedAppDelegate
中,您正在分配 AppDelegate
class 的新实例。相反,您想要的是在应用程序启动时捕获 UIApplication
为您创建的实例。最简单的方法是使用 sharedApplication
单例,它已经存储了委托实例:
+ (AppDelegate *)sharedAppDelegate {
return [[UIApplication shareApplication] delegate];
}