2014-06-06 5 views
0

예를 들어, 다음 코드에서.헤더의 속성보다는 인스턴스 변수를 언제 선언해야합니까?

@interface TUTViewController : UIViewController 
{ 
    NSTimer *timer; 
} 
@end 

@interface TUTViewController : UIViewController 

@property (weak, nonatomic) NSTimer *timer; 

@end 

는 시나리오에서 우리는 변수를 선언하는 첫 번째 방법을 사용합니까?

+3

get/set 논리를 제어하려면 속성을 선언하십시오. 또한 당신이 가지고있는 ivar에 상응하는 속성은 약하지 않을 것입니다. –

+1

.h에 ivars를 넣지 마십시오. ivars는 항상 공개적으로 속하지 않는 개인적인 의미 여야합니다. ivars를 만들면 .mars 파일에 넣으십시오. – rmaddy

+0

나는 거의 말할 수 없다. objC 유형의 경우 항상 속성을 사용하십시오. 구현에서 ivar를 사용해야하는 경우 어쨌든 할 수 있습니다. 예를 들어 속성으로 C++ 참조를 사용하는 데 문제가있어서 objC 유형을 보았습니다. –

답변

2

당신은 종종 하드 빠른 규칙으로 진술이 많은 의견을거야.

예 :

매디 다음 .H에서 인스턴스 변수를 넣어하지 마십시오. ivars는 항상 개인 공개 이어야하며 이는 대중에 속하지 않음을 의미합니다. 당신이 인스턴스 변수를 만드는 경우하는 .m 파일

내가 매디 엄청난 존경에 을 넣어,하지만 난이 일에 그와 함께 동의하지 않는다.

.m 파일에 iVars를 넣으면 다른 클래스에서 숨겨 지지만 자신이 만든 하위 클래스에서도 숨겨집니다.

인스턴스 변수를 @protected로 표시하는 것이 좋으며,이를 사용하면 서브 클래스에서 사용할 수 있지만 다른 클래스에서는 사용할 수 없게됩니다.

다른 모든 것은 당신이 모든 속성을 만들라고 말합니다. ARC가 시작되기 전에 속성의 setter를 사용하여 객체의 메모리를 관리 할 수 ​​있으므로 모든 객체를 속성에 저장하는 것이 좋습니다. (유지 된 속성에 값을 할당 할 때 setter는 먼저 이전 값을 해제하고 새 값을 유지합니다.) 이제 ARC가 iVars에 대해서도 처리하므로 모든 것을 속성으로 만드는 인수가 적습니다.

  1. 나는 특별한 동작과 사용자 정의 게터 또는 세터 방법이 필요합니다 내가 무엇

    은 바르가,하지 않는 한 모든 것을 확인하는 것입니다.

  2. 다른 개체의 값에 액세스하려고합니다.
  3. 다른 스레드에서 액세스하려면 속성을 "원자"로 표시해야합니다. (귀하의 모든 속성을 선언하는 습관을 "비 원자."당신은, 당신은 비 원자 원하는 위해입니다 원자 모르는 경우. 원자 특성 비 원자보다 더 느립니다.)

을 말하자면 정책 I NEVER은 물적 자산을 제외한 다른 오브젝트의 iVars에 액세스합니다.

인스턴스 변수가 아닌 속성 사용시 작지만 실제 양의 오버 헤드가 있습니다. 읽기/쓰기 속성은 항상 메서드 호출을 만듭니다. iVar는 메서드 호출의 오버 헤드없이 직접 메모리에 액세스합니다. 일반적으로 그 차이는 너무 작아서는 안됩니다. 그러나 대형 이미지에서 모든 픽셀에 무언가를 수행하거나 실시간으로 비디오 또는 오디오 샘플을 처리하는 콜백을 처리하는 것과 같이 수백만 건의 작업을 수행하는 경우 차이가 커질 수 있습니다.

+1

하위 클래스는 수퍼 클래스의 ivars에 액세스 할 수 없습니다. 캡슐화가 중단됩니다. 우리 모두가 확장 한 Apple 클래스에서 ivars에 액세스 할 수없는 이유가 있습니다. 그래서 일이 깨지지 않습니다. 자신의 수업에서 같은 지침을 따르십시오. Protected ivars는 디자인 선택이 좋지 않아 클래스 계층을 허약하게 만듭니다. – rmaddy

0

아주 좋은 이유가 없다면 @properties를 사용하는 것이 좋습니다. 토론은 기술적 인 것보다 종교적인 것이지만 우리가 아마 Mac of Cult의 추종자이기 때문에 Apple이 당신에게 @ 속성을 사용하기를 선호한다면 그것은 표준입니다.제 생각에는 ReSharper가 Visual Studio에서 (예를 들어 var를 사용하지 않을 때 경고합니다.) Apple의 문서와 Xcode는 표준에 너무 까다로운 것이 아닙니다. 그것이 유감스러운 점은 다른 사람 다음에 코드를 가져 오는 것이 더 쉬울 것이기 때문입니다.

@interface ABCMySpiffyClass() 

@property (weak, nonatomic) IBOutlet UIImageView *spiffyImage; 
@property (weak, nonatomic) IBOutlet UILabel *spiffyTitle; 

@end 

이이 클래스의 또 다른 소비자에게 완전히 개인 아니지만이에 숨겨져 :

다음과 같이하는 .m 파일에서 "숨기기"@properties, 당신은 그것을 선언해야 할 수있는 방법이있다 첫눈. 다른 개발자에게이를 사용해서는 안됨을 알려야합니다. 필자는 공공/개인이 대부분의 응용 프로그램에 대한 응용 프로그램 보안과 관련이 있으므로 문서 작업과 관련이 있다고 생각합니다.