2010-11-30 1 views
2

대부분의 iOS SDK 튜토리얼에서 저는 애플과 다른 곳에서 온라인으로 읽었습니다. 그래서 많은 인스턴스 변수가 그들 자신의 클래스 안에서만 액세스 될지라도 프로퍼티로 만들어집니다.iOS SDK 튜토리얼에서 모든 것이 왜 속성입니까?

E.G. Facebook의 최신 iOS SDK에서 사용자는 facebook이라는 Facebook 클래스 인스턴스를 앱 대리인에서 유지 관리하는 것이 좋습니다. facebook"은 재산입니다. 그런 다음 샘플 코드에서 "self.facebook"이라고합니다. 그러나 "facebook"속성은 애플 리케이션 델리게이트 외부 어디서나 참조되지 않습니다.

왜 이런가요? 내가 뭘 놓치고 있니? 인스턴스 변수가 자체 클래스 내에서만 사용되는 경우 내 성향은 이 아니며이 아니므로 공개적으로 볼 수 없으므로 self.facebook 또는 self->facebook이 아닌 facebook으로 간단히 참조하십시오.

솔직히 말해서, 내가 facebook 속성을 필요로했다하더라도, 나는 "self.facebook"보다는 단순히 "facebook"으로 애플 리케이션 델리게이트 내에서 그것을 참조하고 싶습니다.

그래서 무엇을 제공합니까? 왜 나는 모든 곳에서 속성을 볼 수 있습니까?

답변

7

속성은 iVar가 공개적으로 노출되었는지 여부와 관련이 없습니다. 대신 속성은 보존을 관리하고 캡슐화를 촉진하는 접근 자 메서드를 만듭니다.

전용 속성을 사용하려면 ivar을 @private 지시문으로 선언 한 다음 구현 파일에서 속성을 정의하십시오.

+0

이것은가는 길입니다. 속성을 사용하는 것은 좋지만 클래스 외부에서 사용하지 않으려는 속성은 공개하지 않는 것이 좋습니다. 또한 속성을 사용하여 보존을 관리하는 데 도움이된다는 의견을 강화합니다. –

+1

대단한데, 내 질문에 명확하지 않지만, 이것은 내가 찾고있는 대답이다. 나는 속성을 사용함에있어서 그 값을 본다.하지만 불필요하게 공개적으로 노출 될 것이라는 생각은 내게 전혀 어울리지 않았다. .. @private가 답입니다. –

0

자동으로 getter/setter가 생성됩니다. 또한 여기에 좋은 설명이 있습니다 properties

1

facebook을 참조하면 self.facebook에 액세스하면 변수에 직접 액세스하고 setter/getter 메소드를 사용합니다.

결과가 나중에 개체를 변형 시키거나 somepoint에서 나중에 변경해야하는 경우 값을 변경하는 과정에서 다른 작업을 수행해야합니다 (예 : boxing). 그러면이 작업을 setter 메서드에 넣을 수 있습니다. 모든 곳에서해야하는 것을 줄이십시오. 그것의 좋은 것.

3

보통 인스턴스 변수에 직접 액세스하는 대신 접근자를 통해 액세스하는 것이 좋습니다. 속성은 이러한 접근자를 만들고 적절한 키 - 값 변경 알림 및 원자 적 액세스와 같은 항목을 제공합니다.

3

속성은 getter와 setter를 생성 할 수 있습니다. 특히 setters는 객체 (세미)의 유지/릴리스 횟수를 자동으로 관리 할 수 ​​있으므로 특정 유형의 잠재적 인 메모리 버그를 줄일 수 있습니다.

비 객체의 게터와 속성은 코드의 직교성에 주로 사용되지만 향후 코드 확장이나 재사용에서 뮤 테이터, 키 - 값 통지 등에 사용될 가능성이 있습니다.

효율성 차이/단점이있을 수 있지만 사용중인 특정 ObjC 런타임에 따라 다릅니다.

+0

+1 키 - 값 관측을 위해서도 속성이 필요합니다. 인터페이스 파일 (.h)에 표시되는 공용 속성은 다른 개체에 해당 속성을 호출하는 방법을 알려줍니다. – TechZen

+0

고맙습니다. 훌륭한 답변입니다. –

4

속성을 사용해야하는 이유 중 하나 (TechZen에 명시된대로 속성을 비공개로 설정할 수 있음)의 좋은 예가 viewDidLoad에 새 인스턴스를 만드는 것입니다.

View Controller 인스턴스 당 한 번 호출되므로 사람들은 항상이 작업을 수행합니다. 아니면 그렇게 생각하니?실제로 응용 프로그램이 메모리 경고를 받으면 어떤 일이 발생하기 때문에 viewDidLoad 클래스는 인스턴스 당 여러 번 호출 될 수 있습니다. 그 다음 당신이 누수가, 다시 호출 될 때까지 -

- (void) viewDidLoad 
{ myArray = [[NSMutableArray alloc] init]; } 

가 큰 작품 : 같은

그래서 예를 들어, 당신은 잘 코드를 작성할 수 있습니다. 당신은 myArray를 방금 전에 할당 할 수 있습니다. 그러나 문제는 그것이 잊기 쉬운 단계입니다. 당신이 비록 모든 인스턴스 변수에 대한 속성을 사용하는 경우

는, 다음 코드는 다음과 같습니다

- (void) viewDidLoad 
{ self.myArray = [NSMutableArray array]; } 

이제 당신이 잘못 얻을 수 없습니다. viewDidLoad가 여러 번 호출되면 이전 배열이 누출되지 않고 이전 배열이 해제되고 새 배열이 해당 위치로 이동합니다.

+0

예 : 예! 감사. –