programing

IBOutlet은 ARC에서 강해야 합니까, 약해야 합니까?

stoneblock 2023. 4. 9. 21:03

IBOutlet은 ARC에서 강해야 합니까, 약해야 합니까?

ARC, iOS5, ARC, iOS5, ARC, iOS, ARC, iOS, iOS, ARC, iOS, iOS, ARC, iOS, iOS, ARC, iOS, iOS, ARC, iOS5★★★★★★★★★★ 。IBOutlet ~ ~까지UIView는 s('서브클래스')입니다.strong ★★★★★★★★★★★★★★★★★」weak

다음 항목:

@property (nonatomic, weak) IBOutlet UIButton *button;

이 모든 것을 없앨 수 있습니다.

- (void)viewDidUnload
{
    // ...
    self.button = nil;
    // ...
}

거거하 는는? ??? ???은 '어디서든 를 사용하고 있습니다.strong이는 'Interface Builder' 편집기에서 헤더에 직접 연결하면 자동으로 생성되는 속성입니다만, 그 이유는 무엇입니까?UIViewController 있다strong 「」의 .view서브뷰를 유지합니다.

경고, 오래된 답변: 이 답변은 WWDC 2015에 따라 최신이 아닙니다. 정답은 위의 승인된 답변(다니엘 홀)을 참조하십시오.이 답변은 기록에 남습니다.


개발자 라이브러리에서 요약:

실용적인 관점에서 iOS 및 OS X에서는 콘센트를 선언된 속성으로 정의해야 합니다.일반적으로 콘센트는 약해야 합니다.단, 파일 소유자부터 니브 파일(iOS에서는 스토리보드 장면)의 최상위 오브젝트까지의 콘센트는 약해야 합니다.따라서 작성하는 콘센트는 기본적으로 다음과 같은 이유로 약해집니다.

  • 뷰 컨트롤러 뷰나 윈도 컨트롤러 창 등의 서브뷰에 작성하는 아웃렛은 소유권을 의미하지 않는 오브젝트 간의 임의의 참조입니다.

  • 강력한 콘센트는 프레임워크클래스(예를 들어 UIViewController의 뷰 콘센트 또는 NSWindowController의 윈도 콘센트)에 의해 자주 지정됩니다.

    @property (weak) IBOutlet MyView *viewContainerSubview;
    @property (strong) IBOutlet MyOtherClass *topLevelObject;
    

현재 애플이 권장하고 있는 베스트 프랙티스는 IBOutlets가 강하다는 것입니다.단, 리테이닝 사이클을 피하기 위해 특별히 약점이 필요하지 않은 경우입니다.위에서 언급한 바와 같이, 이는 WWDC 2015의 "Implementing UI Designs in Interface Builder" 세션에서 Apple Engineer가 다음과 같이 말했습니다.

마지막으로 지적하고 싶은 것은 스토리지 타입입니다.스토리지 타입은 강력하거나 약할 수 있습니다.일반적으로 콘센트를 뷰 계층에 의해 항상 유지되지는 않는 서브뷰 또는 제약조건에 연결하는 경우에는 특히 콘센트를 강하게 해야 합니다.콘센트를 약하게 하려면 뷰 계층을 백업하고 일반적으로 권장하지 않는 항목을 참조하는 커스텀 뷰가 있는 경우에만 필요합니다.

IB팀 엔지니어에게 트위터를 통해 문의했더니 Strong이 기본이고 개발자 문서가 업데이트되고 있음을 확인했습니다.

https://twitter.com/_danielhall/status/620716996326350848 https://twitter.com/_danielhall/status/620717252216623104

문서에서는 서브뷰의 속성에 사용을 권장하고 있지만 iOS 6에서는 (기본 소유권 한정자)를 사용하는 것이 좋습니다.그것은 의 변화에 의해 야기된다.UIViewController뷰는 언로드되지 않습니다.

  • iOS 6 이전 버전에서는 컨트롤러 뷰의 서브뷰에 대한 강력한 링크가 유지되고 뷰 컨트롤러의 메인뷰가 언로드되면 뷰 컨트롤러가 있는 한 서브뷰가 유지됩니다.
  • iOS 6 이후 뷰는 언로드되지 않고 컨트롤러가 있는 한 로드된 상태로 유지됩니다.그러니 강한 성질은 문제가 되지 않습니다.또한 강력한 참조 그래프를 가리키기 때문에 강력한 참조 주기를 생성하지 않습니다.

그렇다고는 해도, 이 제품을 사용할지 어떨지 고민하고 있습니다.

@property (nonatomic, weak) IBOutlet UIButton *button;

그리고.

@property (nonatomic) IBOutlet UIButton *button;

iOS 6 이후:

  • 「」를 사용합니다.weak컨트롤러가 버튼의 소유권을 원하지 않는다고 명시되어 있습니다.

  • 하지만 빠뜨리는 것은weak언로드가 없는 더 .iOS 6에서는 뷰 언로드가 없는 경우 문제가 되지 않으며, 더 짧습니다.그게 더 빠르다고 지적하는 사람도 있겠지만, 저는 아직 앱이 너무 느리다는 것을 본 적이 없습니다.weak IBOutlets.

  • 「」를 .weak오류로 인식될 수 있습니다.

결론:iOS6에서는 뷰 언로딩을 사용하지 않는 한 더 이상 틀릴 수 없습니다.파티할 시간이다.;)

그것에서 어떤 문제점도 발견하지 못했어요.프리 ARC,는 항상 ARC를 .assign이미 슈퍼뷰에 보존되어 있기 때문입니다.을 만들면weak"viewDidUnload" "0" "DidUnload" 입니다.

가지주의사항: 4.할 수 ARC 4.x할 수 없습니다.weakassign'0'은 '0'은 '0'으로 표기하고 viewDidUnload포인터가 달랑거리는 것을 피하기 위해.다음은 제가 경험한 점멸 포인터 버그의 예입니다.

UIViewController에는 우편 번호용 UITextField가 있습니다.CLLocation Manager를 사용하여 사용자의 위치를 역방향으로 코드화하고 우편번호를 설정합니다.다음은 대리인의 콜백입니다.

-(void)locationManager:(CLLocationManager *)manager
   didUpdateToLocation:(CLLocation *)newLocation
          fromLocation:(CLLocation *)oldLocation {
    Class geocoderClass = NSClassFromString(@"CLGeocoder");
    if (geocoderClass && IsEmpty(self.zip.text)) {
        id geocoder = [[geocoderClass alloc] init];
        [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
            if (self.zip && IsEmpty(self.zip.text)) {
                self.zip.text = [[placemarks objectAtIndex:0] postalCode];
            }
        }];    
    }
    [self.locationManager stopUpdatingLocation];
}

내가 적절한 시기에 이 견해를 무시하고 스스로 아무것도 하지 않는다면, 나는 그것을 알게 되었다.지퍼로 잠그다viewDidUnloadself.zip.text를 사용합니다.

IBOutlet퍼포먼스상의 이유로 강해야 합니다.iOS 9의 스토리보드 레퍼런스, Strong IBOutlet, Scene Dock 참조

이 단락에서 설명한 바와 같이 뷰 컨트롤러 뷰의 서브뷰에 대한 아웃렛은 약할 수 있습니다.이는 이러한 서브뷰가 이미 니브파일의 최상위 오브젝트에 의해 소유되기 때문입니다.그러나 아웃렛이 약한 포인터로 정의되고 포인터가 설정된 경우 ARC는 런타임 함수를 호출합니다.

id objc_storeWeak(id *object, id value);

오브젝트 값을 키로 사용하여 포인터(개체)를 테이블에 추가합니다.이 테이블을 약 테이블이라고 합니다.ARC는 이 테이블을 사용하여 응용 프로그램의 모든 취약한 포인터를 저장합니다.오브젝트 값이 할당 해제되면 ARC는 약한 테이블에서 반복하여 약한 참조를 0으로 설정합니다.또는 ARC는 다음을 호출할 수 있습니다.

void objc_destroyWeak(id * object)

그러면 오브젝트는 등록 해제되고 objc_destroy가 됩니다.다시 약한 호출:

objc_storeWeak(id *object, nil)

약한 참조와 관련된 이러한 부기는 강력한 참조가 공개되는 것보다 2-3배 더 오래 걸릴 수 있다.따라서 약한 참조로 인해 런타임에 대한 오버헤드가 발생합니다.이 오버헤드는 콘센트를 강도로 정의하기만 하면 회피할 수 있습니다.

에서는 Xcode 7을 제안하고 .strong

WWDC 2015 세션 407 Interface Builder에서 UI 설계 구현(Implementing UI Designs in Interface Builder)을 보면 제안합니다(http://asciiwwdc.com/2015/sessions/407)에서 인용).

마지막으로 지적하고 싶은 것은 스토리지 타입입니다.스토리지 타입은 강력하거나 약할 수 있습니다.

일반적으로 콘센트를 하위 뷰 또는 뷰 계층에 의해 항상 유지되지는 않는 제약조건에 연결하는 경우에는 특히 콘센트를 강하게 해야 합니다.

콘센트를 약하게 하려면 뷰 계층을 백업하고 일반적으로 권장하지 않는 항목을 참조하는 커스텀 뷰가 있는 경우에만 필요합니다.

그래서 strong을 선택하고 connect를 클릭하면 콘센트가 생성됩니다.

iOS 개발에서는 NIB 로딩이 Mac 개발과는 조금 다릅니다.

Mac 개발에서 IBOutlet은 일반적으로 약한 참조입니다. NSViewController의 하위 클래스가 있는 경우 최상위 뷰만 유지되고 컨트롤러의 할당 해제 시 모든 하위 뷰와 콘센트가 자동으로 해방됩니다.

UiView컨트롤러는 키 값 코딩을 사용하여 강력한 참조를 사용하여 콘센트를 설정합니다.따라서 UIViewController의 할당을 해제하면 상단 뷰의 할당이 자동으로 해제되지만 모든 콘센트의 할당도 해제 방식으로 수행해야 합니다.

Big Nerd Ranch의 투고에서는 이 토픽에 대해 설명하고 IBOutlet에서 강력한 참조를 사용하는 것이 좋지 않은 이유에 대해서도 설명합니다(이 경우 Apple이 권장하는 경우에도 마찬가지).

여기서 한 가지 짚고 넘어가야 할 점은 Apple 엔지니어가 WWDC 2015 비디오에서 밝힌 내용에도 불구하고 다음과 같습니다.

https://developer.apple.com/videos/play/wwdc2015/407/

애플은 이 문제에 대해 계속 생각을 바꾸고 있는데, 이것은 우리에게 이 질문에 대한 단 하나의 정답이 없다는 것을 말해준다.애플 엔지니어들조차 이 문제에 대해 의견이 분분한 것을 보여주기 위해 애플의 최신 샘플 코드를 보면 어떤 사람들은 약하게 사용하고 어떤 사람들은 그렇지 않다는 것을 알 수 있을 것이다.

이 Apple Pay 예에서는 weak를 사용하고 있습니다.https://developer.apple.com/library/ios/samplecode/Emporium/Listings/Emporium_ProductTableViewController_swift.html # //apple_ref / doc / uid / TP40016175 - Emporium _ ProductTableViewController _ swift - DontLinkElementID _ 8

이 픽처 인 픽처 예시와 마찬가지로 https://developer.apple.com/library/ios/samplecode/AVFoundationPiPPlayer/Listings/AVFoundationPiPPlayer_PlayerViewController_swift.html #//apple_ref/doc/uid/TP40016166-AVFoundation PiPPlayer_PlayerViewController_swift-DontLinkElementID_4

리스터 예시와 마찬가지로 https://developer.apple.com/library/ios/samplecode/Lister/Listings/Lister_ListCell_swift.html#//apple_ref/doc/uid/TP40014701-Lister_ListCell_swift-DontLinkElementID_57

코어 로케이션의 예로서 https://developer.apple.com/library/ios/samplecode/PotLoc/Listings/Potloc_PotlocViewController_swift.html #//apple_ref/doc/uid/TP40016176-Potloc_PotlocViewController_swift-DontLinkElementID_6이 있습니다.

뷰 컨트롤러의 프리뷰 예시와 마찬가지로 https://developer.apple.com/library/ios/samplecode/ViewControllerPreviews/Listings/Projects_PreviewUsingDelegate_PreviewUsingDelegate_DetailViewController_swift.html #//apple_ref/doc/uid/TP40016546-Projects_PreviewUsingDelegate_PreviewUsingDelegate_DetailViewController_swift-DontLinkElementID_5도 마찬가지입니다.

HomeKit 예시와 마찬가지로 https://developer.apple.com/library/ios/samplecode/HomeKitCatalog/Listings/HMCatalog_Homes_Action_Sets_ActionSetViewController_swift.html #//apple_ref/doc/uid/TP40015048-HMCatalog_Homes_Action_Set_ActionViewController_swift-DontLinkElementID_23

이 모든 것은 iOS 9용으로 완전히 업데이트 되어 있으며, 모두 약한 콘센트를 사용하고 있습니다.이것으로부터 A를 알 수 있다.그 문제는 몇몇 사람들이 생각하는 것처럼 간단하지 않다.B. Apple은 여러 번 마음을 바꿨고 C.만족할 수 있는 것은 무엇이든 사용할 수 있습니다.

이 답변에 대한 설명과 참고 자료를 주신 Paul Hudson(www.hackingwithsift.com의 저자)에게 특별히 감사드립니다.

이것으로 주제가 좀 더 명확해졌으면 좋겠다!

몸조심하세요.

WWDC 2015부터는 Interface Builder에서 UI 설계 구현에 대한 세션이 있습니다.32분대쯤 되면 그는 당신이 항상 원하는 것을 만들 수 있다고 말한다.@IBOutlet 강렬하다

IBOutletCollectionshould be @property (strong, nonatomic).

몇 년 동안 뭔가 변한 것처럼 보이며, 현재 애플은 일반적으로 강한 사용을 권장하고 있다.WWDC 세션에 대한 증거는 세션 407 - Interface Builder에서 UI 설계 구현에 있으며 32:30부터 시작됩니다.그가 말한 내용은 (정확히는 않지만) 다음과 같습니다.

  • 일반적으로 콘센트 연결은 특히 뷰 계층에 의해 항상 유지되지 않는 하위 뷰 또는 제약 조건을 연결하는 경우 강력해야 합니다.

  • 보기 계층에서 백업하는 것에 대한 참조가 있는 사용자 지정 보기를 생성할 때 약한 콘센트 연결이 필요할 수 있으며 일반적으로 권장되지 않습니다.

다른 병동에서는 커스텀 뷰의 일부가 뷰 계층에서 뷰의 일부를 위로 하여 유지 주기를 생성하지 않는 한 항상 강력해야 합니다.

편집:

어떤 사람들은 질문을 할 수 있다.강력한 참조로 유지하면 루트 뷰 컨트롤러로서의 유지 사이클이 생성되지 않고 소유 뷰에서 해당 참조가 유지됩니까?아니면 왜 그런 변화가 일어났을까요?이 강연의 앞부분에서 팁이 Xib에서 어떻게 만들어지는지를 설명할 때 답이 나올 것입니다.VC 및 뷰에 대해 별도의 니브가 생성됩니다.그래서 추천을 바꾸는 것 같아요.그래도 애플로부터 좀 더 자세한 설명을 듣는다면 좋을 것 같습니다.

가장 중요한 정보는 xib의 요소가 자동으로 뷰 서브뷰에 표시된다는 것입니다.서브뷰는 NSArray입니다.NSArray가 소유합니다.등등의 포인트는 강합니다.따라서 대부분의 경우 다른 강력한 포인터(IBOutlet)를 만들고 싶지 않습니다.

또한 ARC를 사용하면 에서 아무것도 할 필요가 없습니다.viewDidUnload

언급URL : https://stackoverflow.com/questions/7678469/should-iboutlets-be-strong-or-weak-under-arc