ARC의 속성 : 항상 또는 공개 전용?


9

2 년 전에 Robert McNally"코드 명령 : Objective-C 코딩 모범 사례" 라는 기사를 읽은 후 Objective-C 클래스의 거의 모든 데이터 멤버에 대해 속성을 사용하는 방법을 채택했습니다 ( 2012 년 5 월 현재 제 3 계명). McNally는 다음과 같은 이유를 설명합니다 (내 강조).

  1. 속성은 액세스 제한 (예 : 읽기 전용)을 시행합니다
  2. 속성은 메모리 관리 정책을 시행합니다 (강함, 약함)
  3. 속성은 사용자 지정 세터 및 게터를 투명하게 구현할 수있는 기회를 제공합니다.
  4. 사용자 정의 setter 또는 getter가있는 특성을 사용하여 스레드 안전성 전략을 시행 할 수 있습니다.
  5. 단일 방법으로 인스턴스 변수에 액세스하면 코드 가독성이 향상됩니다.

내 속성의 대부분을 개인 범주에 넣었으므로 1 번과 4 번은 일반적으로 문제가되지 않습니다. 인수 3과 5는 더 '부드럽고', 올바른 도구와 기타 일관성으로 인해 문제가되지 않을 수 있습니다. 마지막으로, 나에게 가장 큰 영향을 미치는 논점은 메모리 관리였습니다. 나는 그 이후로 이것을 해왔다.

@property (nonatomic, strong) id object; // Properties became my friends.

마지막 몇 가지 프로젝트에서 ARC를 사용하기로 전환했습니다.이를 통해 거의 모든 것에 대한 속성을 만드는 것이 여전히 좋은 아이디어인지 아니면 약간 불필요한 지 의심 스럽습니다. ARC는 나를 위해 Objective-C 객체를 관리하는 메모리를 관리 strong합니다. ivar을 선언하면 대부분의 회원에게 잘 작동합니다. 어쨌든 ARC 전후에 수동으로 관리해야하는 C 유형이며 weak속성은 대부분 공용 유형입니다.

물론 클래스 외부에서 액세스 해야하는 항목에는 여전히 속성을 사용하지만 대부분은 소수의 속성에 불과하지만 대부분의 데이터 멤버는 구현 헤더 아래에 ivar로 나열됩니다.

@implementation GTWeekViewController
{
    UILongPressGestureRecognizer *_pressRecognizer;
    GTPagingGestureRecognizer *_pagingRecognizer;
    UITapGestureRecognizer *_tapRecognizer;
}

실험으로 나는 이것을 좀 더 엄격하게 해왔으며 모든 속성에서 벗어나는 것은 긍정적 인 부작용이 있습니다.

  1. 데이터 멤버 코드 요구 사항 ( @property/ @synthesize)은 ivar 선언으로 축소되었습니다.
  2. self.something참조의 대부분은 그냥 정리했다 _something.
  3. 어떤 데이터 멤버가 개인 (ivars)이고 어떤 데이터 멤버 (public)인지 쉽게 구별 할 수 있습니다.
  4. 마지막으로, 이것이 애플이 의도 한 목적인 것 같은 느낌이 들지만, 주관적인 추측입니다.

질문에 : 나는 구현 측면 을 선호하여 점점 더 적은 속성을 사용하여 어두운 쪽으로 천천히 미끄러 져 가고 있습니다. 왜 모든 것에 속성을 사용해야하는지에 대한 약간의 추론을 제공 할 수 있습니까, 아니면 필요한 경우에만 더 많은 ivar와 적은 속성을 사용해야하는 이유에 대한 현재의 생각을 확인할 수 있습니까? 어느 쪽이든에 대한 가장 설득력있는 대답은 나의 표를 받게 될 것입니다.

편집 : McNally는 트위터에서 다음과 같이 말합니다 . "속성을 고수하는 주된 이유는 모든 것을 수행하는 한 가지 방법 (KVC / KVO 포함)입니다."

답변:


5

왜 모든 것에 속성을 사용해야 하는가에 대한 약간의 추론을 제공 할 수 있습니까, 아니면 왜 필요한 경우에만 더 많은 ivar와 적은 속성을 사용해야하는지에 대한 현재의 생각을 확인할 수 있습니까?

지금은 그것이 대부분 스타일의 문제라고 말하는 것이 공평하다고 생각합니다. 당신이 말했듯이, 속성의 메모리 관리 이점은 ARC에서 덜 중요합니다. 다른 한편으로, 직접 ivar 액세스로 돌아가는 "혜택"은 매우 설득력이 없습니다.

  1. @property 선언은 ivar 선언과 매우 유사합니다. @synthesize 지시어를 피하는 것은 큰 승리처럼 보이지 않습니다-우리는 많은 코드에 대해 이야기하지 않습니다.

  2. foo.something구문은 훨씬 더보다는 틀림없이 _something. 속성 액세스 구문은 구조의 멤버에 액세스하기위한 C의 도트 구문처럼 보이고 작동하도록 분명히 설계되었습니다. 어떤 객체에 액세스하고 있는지 ( self다른 것이 든 다른 것이 든) 명시 적으로 도움이됩니다. ( self->something이런 이유로 일부 사람들은 저와 는 다릅니다 !) ivar 액세스를 옹호 합니다. ivar의 주요 밑줄 규칙은 괜찮지 만 모든 Objective-C 코드에서 일관되게 사용되지는 않습니다.

  3. 속성은 동일한 클래스의 다른 객체 ( "개인"액세스에서 허용됨)에 저장된 데이터에 액세스하고 하위 클래스 (C ++의 "보호됨")에 의한 액세스에 더 적합한 선택 인 것 같습니다. 따라서 'properties == public'아이디어는 다소 모호합니다.

  4. 제 생각에는 속성은 메모리 관리를 단순화하고 다른 이점을 제공하기위한 것입니다. 말하자면, 메모리 관리 이점이 줄어들면 속성이 덜 매력적으로 보입니다.

내부 데이터에 대한 직접 ivar 액세스로 돌아가는 경로는 매우 합리적인 선택으로 보일 것이며 코스를 변경할 이유가 없습니다. 그러나 속성을 고수하는 것도 상당히 합리적입니다. 단점은 크지 않으며 KVO 준수 및보다 일관된 멤버 액세스 스타일과 같은 몇 가지 장점이 있습니다.

Objective-C의 진화에서 속성은 마지막 단계가 아니 었으며 ARC도 마찬가지라고 생각하지 않습니다. 특정 정보가 없지만 속성을 더 강력하거나 덜 만드는 특정 시점에 추가 기능이 추가 될 수 있습니다. 우리는 기다려서 무슨 일이 일어나는지보아야 할 것입니다.


1
@Caleb 님, 시간을내어 견고한 게시물을 작성해 주셔서 감사합니다. 나는 KVO 측면을 생각하지 못했습니다. 애플이이 모든 것을 어디로 가져 가는지 궁금하다. ARC는 일련의 단계에서 하나의 느낌입니다. 다른 사람이 주제에 대해 무게를 측정하고 싶은지 기다릴 것입니다. 그렇지 않으면 표시된 질문 확인을 고려하십시오.
epologee

1
@epologee 다행입니다. ivar의 더하기 열에 추가 할 항목 중 하나는 디버거에서 쉽게 볼 수 있다는 것입니다. 속성이 사용하는 ivar을 명시 적으로 선언 한 경우 속성도 마찬가지입니다 . 합성 된 ivar은 디버거에 표시되지 않습니다. (언젠가 그 변화를 보게 된 것에 놀라지 않을 것입니다.)
Caleb

-1

나는 또한이 질문에 대해 숙고하고 있습니다. 겸손한 의견에서 접근 자에 대한 속성 만 사용하면 코드를 훨씬 쉽게 읽을 수 있습니다. 공개적으로 액세스 할 변수를 즉시 확인할 수 있습니다. 그리고 개인적으로 항상 변수 앞에 @property (...)를 입력하면 시간이 많이 걸립니다.


안녕하세요 알렉스, 여기에 대한 최신 질문에 대답하는 것이 좋습니다. 시간이 많이 걸리는 논쟁에 대해서는 동의하지 않습니다. 나는 글로 쓰는 시간을 절약 해주는 코드를 작성하지 않고, 미래의 자기 자신이나 다른 사람이 그것을 이해할 수있는 시간을 절약하는 코드를 작성하고 싶다. 즉, -1 투표는 내 것이 아니었다. 그 사람이 투표를 명확히하는 것이 좋을 것입니다.
epologee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.