문제

나는 대부분의 속성을 이해한다고 믿는다. 내 질문은 인스턴스 변수에 대한 속성이있는 경우 구현 파일의 메소드 내에서 설정하거나 검색중인 경우 사용해야합니다. self.myProperty 아니면 그냥 myProperty? 나는 하나의 작품을 알고 있지만, 혼합 규칙을 보았고, 때로는 코드가 변수에 직접 그리고 다른 시간에 속성을 통해 액세스합니다.

이를 수행하는 기술적 이유가 있습니까? 단지 컨벤션/개인 선호도입니까? 그리고 메소드의 매개 변수 이름이 인스턴스 변수 이름과 충돌하는 인스턴스를 참조하지 않습니다. 이는 속성을 사용하는 이유 중 하나 일 수 있습니다 (적어도 다른 언어에서는 이것에 대해 모르겠습니다.). 구현 내에서 속성을 사용하면 재산을 선언 한 방식을 활용하고 싶다고 가정합니다.IE 비 원자, 유지), 예를 들어 방법으로는 다음을 수행 할 수 있습니다.

self.myProperty = [someObject someAutoReleasedObject];

대신에:

myProperty = [[someObject someAutoReleasedObject] retain];

이것이 이유입니까? 재산을 사용하는 것이 좋을 특정 상황 만 있습니까?

나는 Objective-C를 처음 접했고, 이것은 내가 혼란 스러웠던 몇 안되는 것 중 하나입니다. 지금까지 나는 재산을 통과하는 것이 실제로 메소드/메시지를 호출/보내고 불필요한 오버 헤드를 추가한다는 잘못된 가정에 따라 인스턴스 변수에 직접 액세스했습니다. 나는 이것에 틀렸다고 확신하지만, 오버 헤드의 차이가 무시할 수 없더라도 (그렇지 않은 경우) 변수에 직접 액세스 할 수있을 때 왜 그것을 추가하도록 선택합니까?

나는 내 생각에 틀렸다고 확신한다. 그래서 내가 여기서 묻는 이유이다.

도움이 되었습니까?

해결책

먼저, Apple 문서 (및 좋은 이유)에 따라 Init 또는 Dealloc에서 세터 나 getter를 사용해서는 안됩니다.

그 외에는 변수가있는 경우 일반적으로 세터를 사용해야합니다.

일반적으로 구현 내에서 IVAR에 액세스하기 위해 getter를 사용하지 않지만 필요한 경우가 있습니다. 특히, Getter가 약간의 연관성 또는 점검을 수행하거나 서브 클래스가 동작을 무시하도록 허용하려는 경우.

확실히, 구현에서 getter를 사용하는 것은 더 일반적이며 안전하지만 일반적으로 무의미하고 낭비입니다. 당신을 선택하십시오.

세터를 사용하는 것은 다른 코드가 변경 사항 (키 값 관찰)을 관찰 할 수있는 어설 션을 제공하고 세터를 무시하고 다른 조정을 수행 할 수있는 기회를 제공하므로 중요합니다.

그러나 내가 강력히 추천하는 한 가지는 IVAR과 귀하의 재산에 다른 이름을 사용하는 것입니다. 정상적인 규칙은 밑줄 접두사입니다 (_), 나는 개인적으로 사용하지만 i_ 애플의 개인 용도와의 혼란을 피하기위한 접두사로. 그렇게하면 우연히 잘못된 것을 사용할 수 없습니다.

self.name // use property
i_name // use ivar
self.i_name // syntax error
name // syntax error

다른 팁

부동산을 외부 세계에 노출시키고 내부적으로 사용하는 경우 코드 전체에 속성을 사용해야합니다. 그 이유는 캡슐화입니다. sobj에 대한 "ID"속성이 있다고 가정 해 봅시다. 어느 시점에서 ID가 동작하는 방식을 대체하기로 결정했다고 말합니다 (아마도 ID가 클래스의 구성원 VAR로 시작했을 수도 있고 진화를 통해 데이터베이스에서 검색된 데이터가됩니다). 이제 클래스 구현을 거쳐서 모든 참조를 멤버 VAR에 데이터베이스 호출로 바꿔야합니다. Self.id가 있다면 Getter를 무시해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top