programing

목표-C 딜러에게 일반적으로 보유하는 대신 자산을 할당하는 이유는 무엇입니까?

powerit 2023. 5. 8. 22:27
반응형

목표-C 딜러에게 일반적으로 보유하는 대신 자산을 할당하는 이유는 무엇입니까?

저는 스콧 스티븐슨이 관리하는 멋진 블로그를 서핑하고 있으며, 딜러들에게 '할당' 속성 대 '유지' 속성을 할당하는 기본 목표-C 개념을 이해하려고 노력하고 있습니다.가비지 수집 환경에서는 둘 다 동일합니다.저는 주로 비GC 기반 환경(예: iPhone)에 관심이 있습니다.

Scott의 블로그에서 직접:

"assign 키워드는 인스턴스 변수를 복사하거나 유지하는 대신 인스턴스 변수에 값을 직접 할당하는 세터를 생성합니다.NSInteger 및 CGFloat와 같은 기본 유형이나 대리인과 같이 직접 소유하지 않는 개체에 적합합니다."

위임 개체를 직접 소유하지 않는다는 것은 무엇을 의미합니까?저는 일반적으로 대표단을 유지합니다. 왜냐하면 만약 제가 그들이 심연으로 사라지는 것을 원하지 않는다면, 유지가 저를 위해 그것을 처리해줄 것이기 때문입니다.저는 보통 UITableViewController를 해당 dataSource에서 추상화하고 위임합니다.저는 또한 그 특정한 목적을 가지고 있습니다.UITableView가 항상 대리인을 배치할 수 있도록 절대 사라지지 않도록 하고 싶습니다.

목표 C 2.0 프로그래밍에서 유지하는 대신 딜러에게 할당 속성을 사용하는 공통 패러다임을 이해할 수 있도록 제가 어디서/왜 틀렸는지 추가로 설명해 주시겠습니까?

감사합니다!

딜러의 유지를 피하는 이유는 유지 사이클을 피해야 하기 때문입니다.

A가 B의 대리인으로 B 세트를 생성합니다. A는 소유자에 의해 해제됩니다.

만약 B가 A를 보유하고 있었다면, B가 A를 소유하고 있기 때문에, A의 할당 해제는 결코 호출되지 않을 것이고, 이로 인해 A와 B가 모두 유출될 것입니다.

A가 B를 소유하고 있기 때문에 Deloc에서 제거하기 때문에 A가 사라질 것에 대해 걱정할 필요가 없습니다.

위임 메시지를 보내는 개체가 위임자를 소유하지 않기 때문입니다.

컨트롤러가 보기 또는 창의 대리인으로 설정하는 경우와 반대인 경우가 많습니다. 즉, 컨트롤러가 보기/창을 소유하므로 보기/창이 대리인을 소유하면 두 개체가 서로 소유하게 됩니다.물론 이것은 동일한 결과를 초래하는 누출(죽어야 하는 물체는 살아 있어야 함)과 유사한 보존 주기입니다.

개체가 피어인 경우도 있습니다. 둘 다 동일한 세 번째 개체가 소유하고 있기 때문일 수 있습니다.

어느 쪽이든 대리인이 있는 개체는 대리인을 유지하면 안 됩니다.

(그런데, 적어도 한 가지 예외가 있습니다.무엇이었는지 기억이 나지 않고, 그럴만한 이유가 없었던 것 같습니다.)


부록(2012-05-19 추가):ARC에서 다음을 사용해야 합니다.weak대신에assign약한 참조는 다음으로 설정됩니다.nil개체가 죽으면 자동으로 위임 개체가 데드 위임자에게 메시지를 보낼 가능성을 제거합니다.

만약 당신이 어떤 이유로 ARC를 멀리한다면, 적어도 변경.assign개체를 가리키는 속성unsafe_unretained이는 이것이 객체에 대한 고정되지는 않지만 영점이 아닌 참조임을 명시합니다.

assignARC 및 MRC 모두에서 비객체 값에 적합합니다.

할당된 위임자가 있는 경우 개체가 할당 해제될 때마다 해당 위임 값을 항상 0으로 설정하는 것이 매우 중요합니다. 따라서 개체는 다른 곳에서 할당 해제되지 않은 경우 항상 dealloc에서 위임 참조를 제거하도록 주의해야 합니다.

그 이면에 있는 이유 중 하나는 유지 주기를 피하기 위함입니다.A와 B 두 개체가 서로를 참조하고 메모리에서 해제되지 않는 시나리오를 피하기 위해서입니다.

NSInteger 및 CGFloat과 같은 기본 유형이나 사용자가 직접 소유하지 않은 개체(예: 대리자)에 대해 정확하게 할당하는 것이 가장 좋습니다.

언급URL : https://stackoverflow.com/questions/918698/why-are-objective-c-delegates-usually-given-the-property-assign-instead-of-retai

반응형