2012-03-09 5 views
1

현재 Objective-C의 메모리 관리 및 속성에 대해 배우고 있습니다. 최근에 @property@synthesize이 어떻게 Objective-C에서 작동하는지에 대해 this postanswers to my previous question을 읽었습니다. 이것은 다소 사물을 분명히했습니다.Objective-C의 로컬 변수 대 멤버 변수

로컬 변수와 멤버 변수를 메모리 관리 측면에서 구별하는 것이 중요하지만 여전히 주제에 대해 완전히 명확하지는 않습니다.

내가있는 경우 :

@interface FooClass : NSObject { 
    NSObject *bar_;  
} 

가 왜 재산을 작성해야합니까? 내 말은, 그 재산이 게터와 세터를 창조한다는 것을 이해하지만 그게 뭐야? foo.bar_ = newObject;을 사용하여 설정할 수있는 인스턴스 변수 bar_이 있습니다. 어떤 이점이있어서 bar이라는 속성을 갖고을 foo.bar = newObject으로 설정하면됩니까?

답변

0

Objective-C에서 도트 구문이 실제로 setter 메서드를 호출하기 때문에 bar_foo.bar_을 사용하여 설정할 수 없습니다.

게다가 일반적으로 bar_ 개인 정보이므로 수업 외부에서 직접 액세스 할 수 없습니다.

속성을 만들면 자동으로 getter/setter 메서드가 만들어집니다. 게다가 메모리 문제도 고려할 것입니다 (속성을 만들 때 지정하는 매개 변수 (예 : 유지, 복사, 할당 등)에 따라). 모든

1

먼저, 인스턴스 변수에 액세스하는 당신은 물론 (

foo->bar_ = newObject; 

를 사용할 필요가

foo.bar_ = newObject; 

사용할 수 없습니다 bar_ 난-VAR 공공 하나로 선언해야합니다 , 컴파일러 오류를 원하지 않는 경우)

위와 같은 객체를 할당하면 모든 할당에 메모리 관리 관련 코드 (예 : ARC가 아닌 프로젝트)를 추가해야합니다. 증가 에드 코드 복잡성.

setter 또는 getter를 재정의하여 속성을 사용하는 또 다른 이유는 할당 또는 값 해결시 사용자 지정 작업을 수행 할 수있게합니다.

하지만 주된 이유는 OOP 원칙에 익숙하지 않은 경우입니다. 추상화입니다. 클래스 사용자는 몰라도 클래스가 내부적으로 구현되는 방식으로 작성해야합니다. 그렇지 않으면 코드에 너무 많은 종속성이 생깁니다. 그리고 뭔가를 분리, 업데이트 또는 지원하는 것은 정말로 어려울 것입니다.

+0

호기심에 서 어떻게 ivar을 공개로 설정합니까? –

+0

'@interface SomeClass : ParentClass { @private id _privateVar; @ public id _publicVar; }' – Denis

0

Getters/Setters는 ivars를 캡슐화하고 메모리 관리, 동시 액세스 (비 원자력 ..) 등을 처리합니다. KVO와 같은 것은 getter/setter와 같은 규칙에 따라 다릅니다.