2012-10-21 5 views
0

구현 파일에서 모든 속성은 비공개로 표시됩니다. 첫 번째 예에서속성과 인스턴스 변수의 차이점은 무엇입니까?

  1. MyObj.m

@interface MyObj() 

@property (nonatomic, strong) NSString *name; 

@end 

@implementation MyObj 

@synthesize name = _name; 

// Some other codes to use "name" like self.name or _name 

@end 


2 MyObj.m


@implementation MyObj 
{ 
    NSString *_name; 
} 

// Some other codes to use _name 

@end 
+0

복제본 [Property versus instance variable] (http://stackoverflow.com/questions/719788/property-vs-instance-variable)이 가능합니다. 사이드 바 참조 ---> –

답변

3

당신이 접근을 얻을 :
그래서 이들 사이의 차이가 무엇인가 나를 위해 생성 된

- (NSString *)name; 
- (void)setName:(NSString *)name; 

Xcode의 최신 버전에서는 @synthesize이 암시 적입니다.

두 번째 예제에서는 방금 만든 ivar가 있습니다.

특별한 경우가 아니라면 일반적으로 나중에 더 많은 유연성을 제공하므로 접근자를 사용하는 것이 좋습니다.

+0

은 "미래에 더 많은 유연성을 제공합니다"라는 말에 동의합니다. 또 다른 질문을하고 싶습니다 : ivar 대신에 property를 사용한다면, 언제 self.name을 사용해야합니까? 그리고 언제 _name을 사용해야합니까? (내가 name = _name을 합성한다고 가정하십시오) – Kevin

+1

프로그래밍의 대부분의 일들처럼 "의존합니다". 접근 자나 init/dealloc 메서드를 재정의하면'_name' 만 사용하는 경향이 있습니다. 그래서 재귀 루프를 발생시키지 않거나 부작용을 일으키지 않고 값을 가져 오거나 설정할 수있는 곳으로 직접 액세스 할 필요가있는 곳만 있습니다. –

+0

init 및 dealloc에서 getter/setter 메서드를 사용하지 않고 직접 ivar를 사용하려는 경우 getter 및 setters를 하위 클래스로 재정의 할 수 있으며 이러한 재정의는 init 및 dealloc 시간에 안전하지 않은 동작을 초래할 수 있기 때문에 항상 사용합니다. 그 두 곳을 벗어나서, 나는 아주 특별한 이유가 없다면 getters/setters를 사용하는 경향이 있습니다. 언급 할 가치가있는 또 다른 것은 @property를 사용하면 단지 당신이 ivar로 얻지 못할 특정 KVC/KVO 행동을 얻을 수 있다는 것입니다. – ipmcc

2

모든 클래스의 데이터 멤버에 항상 @property을 사용하는 것이 좋습니다. 메모리 관리 기능이 내장되어 있으므로 걱정할 필요가 없습니다. 속성은 또한 해당 클래스의 객체를 사용하기 위해 구문 설탕을 추가합니다. 클래스 MyObjobj이 있다면 그래서 나는 단지 인 objname 접근 또한

[obj setName: @"brianSan"]; 

과 똑같은 일이 될 것입니다

obj.name = @"brianSan"; 

obj.name을 통해 달성 될 수있다 할 수 같은 것 [obj name];

개체의 개체 내에서 메서드에 액세스해야 할 때 obj.prop.subprop.subsubprop 대신에 약 800 개의 다른 질문과 함께 [[[obj prop] suprop] subsubprop]

관련 문제