2016-12-19 1 views
0

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 기능이 켜져 있습니다! 내가 사용 단독 들어

crash-log

:

// 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-스타일을

내가 생각 :) 싱글 톤의 문제는 내가 서로 통신하는 세 가지 객체를 가지고 있다는 사실에 근거한다는 것입니다. 이 통신이 도움이되는지 확인하기 위해 통신을 "스타 유형"으로 다시 라우팅합니다.

+3

1) 충돌로 인한 오류는 무엇입니까? 2) 대표자와 싱글 톤은 서로 관련이 없습니다. 그것들은 두 개의 완전히 독립적 인 독립적 인 개념입니다. 3) 왜'@ synthesis '를 사용하고 있습니까? '@ synthesize' (대부분의 경우)를 사용하는 오래된 튜토리얼을 따르지 마십시오. – rmaddy

+0

합성을 사용하지 않는 경우 +1. 제시 한 코드에는 크래시가 없습니다. 'PlayerInterface' 객체의 초기화에 뭔가 잘못 될 수 있습니다. – CharlesThierry

+0

+1 충돌 로그. 우리가 충돌 자체에 대해 더 많이 알지 못하면 조언 할 수있는 것이 거의 없습니다. 위에서 @CharlesThierry가 말했듯이, 위에 게시 한 코드는 잠재적 인 충돌을 실제로 나타내지 않으므로 다른 곳에있는 것처럼 보입니다. 그러나 메모로서; 싱글 톤은 제한된 사용을해야하며, 많은 시간을 투자하면 더 많은 쟁점을 야기하므로 가치가있다. – dlbuckley

답변

0

대리인은 단순히 다른 개체와 마찬가지로 ID 및 기타 속성에 대해 조사 할 수있는 개체입니다. "documentsProtocol"에 "tellMeYourID"메소드를 추가하면 비즈니스를 수행 할 수 있습니다.

+0

나는 이것이 "닭/계란"문제라고 생각합니다 ... 인스턴스 ID로 대리인 참조를 설정하지 않고 그것을 설정하는 방법! – Hecot

+0

"인스턴스 ID "? 당신은 내가하는 것보다 그것에 다른 의미를 붙인 것처럼 보입니다. –

0

나는 프로토콜을 통해 서로 통신하는 세 개의 객체를 가졌습니다. 위임 루프에서 끝나지 않도록주의를 기울였다하더라도 이것이 문제를 일으킨 것으로 보입니다. 통신을 "별 유형"으로 다시 라우팅 한 후에는 모든 문제가 사라집니다. 이제 각 객체는 하나의 다른 객체와 통신하고 있습니다.MainViewController는 중간에 주인이고 내가 정보를 전달해야하는 경우 내가 좋아하는 짧은 방법을 추가 :이 완벽한 솔루션입니다 알고 있지만, 전역 변수를 사용하는 것보다 훨씬 더하지 않습니다

// passing through MainVC to keep star type communication 
- (void)updateList:(NSArray)list { 
    [self.player setList:list]; 
} 

그 플레이어 인스턴스의 ID 보유 :

관련 문제