В настоящее время я работаю над приложением, которое использует четыре протокола для обмена данными между классами. Три работают нормально, но один все еще не работает. Я установил его так же, как и другие, но делегат всегда теряет свой идентификатор. Я совершенно новичок в Objective-C, поэтому я не могу разобраться в этом. Вот что я сделал:iOS - singleton не работает как делегат
У меня есть 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];
}
И, конечно, протокол.h, но это не представляет интереса, так как делегат делает эту проблему! Когда я запускаю код, который я получаю следующий вывод на консоль:
sedPlayer ID: <Interface: 0x1700ab2e0>
sedPlayer: <MainViewController: 0x100406e30>
Player ID: (null)
viewDidLoad: <MainViewController: 0x100409550>
Так что очевидно, что синглтон не работает как экземпляр MainViewcontroller отличается. Для singleton я использую стандартный метод dispatch_once, как и другие протоколы, которые работают нормально. ARC включается. Кто-нибудь знает, что здесь не так, и почему синглтон не работает?
сначала вы должны использовать 'assign' заменить на' strong', когда вы используете 'delegate':' @property (сильный, неатомический) id player', во-вторых, разместите весь свой код в своем вопросе, мы можем найти, где проблема. –
aircraft
^Нет, используйте 'слабый' вместо' assign'. 'assign' потребует от вас« nil »ссылки на этот объект, когда он будет освобожден, или вы получите сбой при отправке сообщения на объект (теперь освобожденный). – AdamPro13
@ Вы уверены, что '[MainViewController sharedInstance]' - это тот же экземпляр 'MainViewController', из которого вызывается' viewDidLoad'? – AdamPro13