2016-08-24 4 views
1

저녁, 내 질문은 이론에 대해 충분합니다. iOS 객체 또는 두 컨트롤러 사이의 델리게이트?

나는 약간의 개체 특성을 추적하기 위해 대표 패턴를 사용하는 것이 좋습니다 애플 개발자 문서에서 읽기 이해했다. 이 방법으로 우리는 객체에 접근하지 않고 델리게이트에 접근 할 수 있습니다. protocolDelegate: class 을 우리는 클래스 내부의 대리자를 선언하는 경우는 약간의 "종류를 방지하기 위해 weak 단어를 사용하는 것이 좋습니다 :

나는 또한 그 정의하는 더 나은 이해 (난 정말이 선택의 이유를하지 않았다) 문제 사이클의 ". 내가 코드와 비트를 연주하는 동안 (?)

그래서, 나는 당신이 컨트롤러를 변경하면 weak delegate가 가고, 때문에 물론, weak delegateview controllers 둘 사이를 통과 할 수 있음을 발견했습니다 weak 일 (또는 적어도 이것이 내가 이해 한 것)이기 때문에 삭제해야합니다.

그래서, 난 2 개 옵션 중에서 선택할 수 있습니다

  • weak 키를 삭제 대리인은 "강력한"합니다.

  • 또는 개체를 전달하고 대리자를 weak으로 유지하십시오.

저는 혼란이 많습니다. 제 마음을 정리할 수 있습니까? : D

답변

2

당신의 SEGUE입니다.

구체적인 예를 들어 설명해 보겠습니다. UIViewControllerUITableView이 있다고 가정 해 보겠습니다. 뷰 컨트롤러에는 테이블 뷰에 대한 강력한 참조가 있습니다. 뷰 컨트롤러는 이제 테이블 뷰에 대한 위임자 역할을하려고합니다.

테이블보기에 해당 대표자에 대한 강력한 참조 번호가있는 경우 다음과 같은 상황이 발생합니다.보기 컨트롤러가 테이블보기에 대한 강력한 참조를 가지며 차례로 테이블보기가 강하게 나타납니다 뷰 컨트롤러를 다시 참조하십시오. 따라서 어느 누구도 할당을 해제 할 수 없습니다.

이주기를 깨기 위해 대리인에 대한 참조는 일반적으로 입니다. 이렇게하면 뷰 컨트롤러의 보유 개수가 결국 0으로 떨어지게되어 결국 테이블 뷰를 해제 할 수있게됩니다.

대리인을 사용하려는 클래스도이 패턴을 따라야하며 약한 대리자에 대한 참조를 사용해야합니다. 그러므로 당신은 당신의 segue를 통해 필요한 참조를 전달해야합니다.

+0

그래서 나는 그 물건을 통과해야한다고 말하고 있습니까? –

+1

이 경우 "개체"가 무엇을 의미하는지 잘 모르겠습니다. 이와 관련하여 앱 디자인을 자세히 설명하지 않았으므로 조언을하기가 어렵습니다. 하지만 당신이'delegate' 속성을'weak'으로 만들 것을 권장합니다. 왜냐하면 그것은 모든 사람들이 따르는 관례이기 때문입니다. (이유는 내 답변에 설명되어 있습니다). – DarkDust

+0

고마워요! 공습 경보 해제! –

1

나는 segue로 객체를 전달한다고 생각합니다. Segues은 Xcode에서 Storyboards를 사용하는 매우 중요한 부분입니다. 다른 유형의 segues을 다시 방문 할 수 있지만,이 중 하나는 "보기"세그먼트를 사용하는 방법과 함께 두 개의보기 컨트롤러를 pass data between하는 방법을 보여줍니다. 사용자 정의 데이터가 필요한 두 번째보기 컨트롤러를 사용자 정의 할 수 있습니다.

segues 예제를 쉽게 사용할 수 있습니다. 당신이 sentstring 내부 destinationViewControllercurrentstring을 보낼 수 아래에서, 또한 ShowSegue 당신이 언급하고있는주기가 사이클을 유지라고 identifier

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "ShowSegue" { 
     if let destinationVC = segue.destinationViewController as? OtherViewController { 
      destinationVC.sentstring = currentstring 
     } 
    } 

} 
+0

고마워요,하지만이 부분을 이미 알고 있었고, 제 질문은 단락과 대표단에 관한 것이 었습니다. 정말로 감사합니다. –

1

내비게이션보기 컨트롤러 사이에서 내비게이션 컨트롤러보기 stack. 당신이 statck 위에 지금 다음 bVCbVC이다 밀거나 다른의 ViewController를 보여 말할 때 스택의 상단이 지금 aVC,

될 것입니다 다음 예를 aVC를 들어

는 firstviewcontroller입니다.

aVC -> bVC(top)

지금 당신이 다음 다른 cVC를 밀어 같은 스택,

aVC -> bVC -> cVC(top) 보인다.

스택 상단은 항상 사용자에게 표시됩니다.

현재 상황에서 aVC 및 bVC 및 cVC는 할당 해제되지 않습니다. 그들은 기억 속에있다. 그러나 cVC를 팝하거나 닫으면 메모리에서 할당을 해제하고 스택 룩어의 최상위 값을

aVC -> bVC(top)과 같이 나타냅니다.

그래서 뷰 ​​컨트롤러는 터지거나 제거되지 않을 때까지 스택에있게됩니다. 따라서 기본적으로 스트로크 참조입니다.

Segue은 아무것도 아니지만 푸시 또는 팝 작동의 그래픽 표현이라고 말할 수 있습니다.

또 다른 점은 대리자가 weak이어야한다는 것입니다. 왜냐하면 강력한 경우주기를 유지할 수 있기 때문입니다.

일반적으로 대표단은 representative이라고 할 수 있습니다.

이제 segue를 사용하는 경우 prepareForsegue에 개체를 보내면 다른 모든 작업이 처리됩니다.

2

나는 이전 질문에 대한 답변이 꽤 잘되어 있기 때문에 질문의 첫 부분에 집중할 것입니다.

다음 상황을 고려하십시오. 어떤 종류의 네트워크 연결을 처리하는 클래스가 있습니다. 서버에 요청을 보내고 응답을받습니다. 이 클래스 외부에는 요청을 트리거하는 버튼과 사용자에게 응답을 표시하는보기가있는 viewController가 있습니다.

기본적으로 네트워크 처리 클래스는 한 손으로 viewController (버튼 누름)에서 메시지를 가져 와서 다른 쪽에서 viewController를 전달할 수 있어야합니다. 따라서 두 클래스간에 양방향 통신이 이루어져야합니다. 네트워크 처리 클래스에 buttonPressed 메시지를 전달하는 것은 꽤 분명하지만 역순 부분 (응답 전달)은 좀 더 까다 롭습니다. 네트워크 처리 클래스가 누가 그것을 작성했는지, 누가 그것을 호출했는지 알 수 없기 때문입니다 (좋은 OO 사례 및 메모리 누출 방지).

위와 같은 방식으로 대리자 패턴이 제공됩니다.이 기능을 사용하면받는 사람에 대해 알지 못해도 개체가 관심이있는 사람에게 데이터를 전달할 수 있습니다.응답을 전달하는 클래스는 '위임자'만 알고 다른 클래스는 알 수 없습니다. 또한 네트워크 처리 클래스를 그대로 가져 와서 다른 프로젝트에 넣을 수 있습니다. 원래 프로젝트의 다른 클래스를 알지 못하기 때문에 일부 '위임'만 수정하면 다른 프로젝트에 추가 할 수 있습니다.

내가 선택한 이유를 얻는 데 도움이되기를 바랍니다.