目前我正在开发一个使用四种协议进行类间通信的应用程序。三个工作正常,但一个仍然无法正常工作。我将其设置与其他设置相同,但代表总是丢失其ID。我对Objective-C很新,所以我无法深究它。这是我做的:
我有一个带有委托
的MainViewController.h@property (weak, nonatomic) id <PlayerProtocol> player;
和MainViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
[[Interface sharedInstance] Init];
NSLog(@"Player ID: %@", _player);
NSLog(@"viewDidLoad: %@", self);
}
- (void)sedPlayer:(id) pointer{ //sed is no typo!
_player = pointer;
NSLog(@"sedPlayer ID: %@", _player);
NSLog(@"sedPlayer: %@", self);
}
+ (instancetype)sharedInstance {
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
在Interface.m(NSObject)
中- (void)Init {
[[MainViewController sharedInstance] sedPlayer:self];
}
当然还有一个protocol.h但是由于代表遇到麻烦所以不感兴趣!当我运行代码时,我在控制台上得到以下输出:
sedPlayer ID: <Interface: 0x1700ab2e0>
sedPlayer: <MainViewController: 0x100406e30>
Player ID: (null)
viewDidLoad: <MainViewController: 0x100409550>
很明显,单例不起作用,因为MainViewcontroller的实例是不同的。对于单例我使用dispatch_once标准方法,就像我使用其他工作正常的协议一样。 ARC已开启。有没有人知道这里有什么问题以及为什么单身人士不工作?
答案 0 :(得分:0)
在这里,我认为你最终得到了MainViewController
的两个实例。我假设第一个是在导航到与MainViewController
相关联的屏幕时创建的。当您在[MainViewController sharedInstance]
中致电Interface.m
时,会创建第二个。
由于ViewController视图是延迟加载的(&#34;视图控制器懒洋洋地加载它们的视图。第一次访问视图属性会加载或创建视图控制器的视图。&#34;来自Apple docs下的视图ViewManagement),当第一个导航到viewDidLoad: <MainViewController: 0x100409550>
并加载视图时,您只会看到MainViewController
日志一次。
这是我的建议:
由于您在Interface
中执行了- (void)viewDidLoad
初始化,因此您也可以设置self.player = [Interface sharedInstance]
。
代码看起来像这样:
- (void)viewDidLoad {
[super viewDidLoad];
self.player = [Interface sharedInstance];
NSLog(@"Player ID: %@", _player);
NSLog(@"viewDidLoad: %@", self);
}
您还应该清除- (void)sedPlayer:(id) pointer
中的+ (instancetype)sharedInstance
和MainViewController
。拥有一个ViewController单例永远不是一个好主意,因为你最终可能会弄乱导航或者有多个状态。
有关避免单身人士的更深入的文章,您可以查看objc.io Avoiding Singleton Abuse