obj-c에 새로 입문하고 현재 임의의 충돌을 일으킨 많은 싱글 톤이 사용되는 기존 코드를 다시 작성했습니다. 나는 이들 중 대부분을 적절한 프로토콜로 대체했지만 여전히 ONE 대리인에 대한 참조를 설정하는 데 어려움을 겪고 있습니다. 싱글 톤과 프로토콜에 대한 글을 여기에서 읽었으며 apple docs을 언급했지만 더 많이 읽으면 혼란스러워집니다. 나는 내가 모르는 부작용이 있다고 생각한다. 누군가 이해할 수 있도록 도와 줄 수 있는가?iOS - 싱글 톤을 사용하여 대리인 참조를 구현할 때의 문제
델리게이트 참조를 설정하는 데 필요한 것은 PlayerInterface 인스턴스의 ID (포인터 주소)입니다.
// define delegate in DocumentsViewController.h
@property (weak, nonatomic) id <documentsProtocol> delegate;
및
을 나는 그것이에 충돌 싱글에 의해 위임 기준을 설정할 때 다음// in DocumentsViewController.m
// set delegate reference using singleton
self.delegate = [PlayerInterface sharedInstance]; // here it crashes!
, 내가 직면하고있어 현재의 문제 : 다음
는 내가 지금까지 한 일이다 실. ARC 기능이 켜져 있습니다! 내가 사용 단독 들어 :// in PlayerInterface.m (NSObject)
+ (instancetype)sharedInstance
{
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
/// 1.EDIT ///
나는 싱글의 초기화에 대해 질문했다 - 내 MainViewController에 .m PlayerInterface 객체는 처음으로 인스턴스화됩니다 :
- (void)viewDidLoad {
self.player = [PlayerInterface sharedInstance];
}
' 또한 dispatch_once를 피하려고 시도했습니다.
- (void)viewDidLoad {
PlayerInterface *play = [[PlayerInterface alloc] init];
self.player = play;
}
하지만 차이는 없습니다 ... 또한 충돌합니다! 도움을 줄 수있는 사람은 누구입니까?
/// 2.EDIT ///
내가 이상한 해결 방법을 시도했습니다가 : 인스턴스화가 PlayerInterface 처음 내가 ID를 글로벌 변수를 만들 때 (나는이 객체의 아이디어에 대한 것을 알고 지향 프로그래밍).
extern id play;
그것을 사용하여 지금은 쉽게 참조를 설정할 수 있습니다 대표단에 올 때 :
그것은 마법처럼 작동self.delegate = play;
, 단지 좋은 오래된 C-스타일을
내가 생각 :) 싱글 톤의 문제는 내가 서로 통신하는 세 가지 객체를 가지고 있다는 사실에 근거한다는 것입니다. 이 통신이 도움이되는지 확인하기 위해 통신을 "스타 유형"으로 다시 라우팅합니다.
1) 충돌로 인한 오류는 무엇입니까? 2) 대표자와 싱글 톤은 서로 관련이 없습니다. 그것들은 두 개의 완전히 독립적 인 독립적 인 개념입니다. 3) 왜'@ synthesis '를 사용하고 있습니까? '@ synthesize' (대부분의 경우)를 사용하는 오래된 튜토리얼을 따르지 마십시오. – rmaddy
합성을 사용하지 않는 경우 +1. 제시 한 코드에는 크래시가 없습니다. 'PlayerInterface' 객체의 초기화에 뭔가 잘못 될 수 있습니다. – CharlesThierry
+1 충돌 로그. 우리가 충돌 자체에 대해 더 많이 알지 못하면 조언 할 수있는 것이 거의 없습니다. 위에서 @CharlesThierry가 말했듯이, 위에 게시 한 코드는 잠재적 인 충돌을 실제로 나타내지 않으므로 다른 곳에있는 것처럼 보입니다. 그러나 메모로서; 싱글 톤은 제한된 사용을해야하며, 많은 시간을 투자하면 더 많은 쟁점을 야기하므로 가치가있다. – dlbuckley