THIS IS ELLIE

Objective-C 프로퍼티 속성 본문

개발/Objective-C

Objective-C 프로퍼티 속성

Ellie Kim 2020. 3. 26. 16:46

프로퍼티는 컴파일러가 자동 생성하는 접근자 메서드를 제어할 때 사용

 

  • 원자성

    • 자동 생성된 접근자 메서드는 기본적으로 메서드가 원자적으로 동작하게 만드는 데 락을 포함한다. 속성을 nonatomic으로 하면 락이 사용되지 않는다. Atomic 속성이 없더라도 명시적으로 원헀을 경우를 대비해 컴파일 에러 없이 원자성이 적용된다. 스스로 접근자 메서드를 정의하는 경우는 메서드가 원자적으로 동작하도록 구현해야 한다. 

  • 읽기/쓰기

    • read/wrtie 게터 세터 모두 사용한다. 프로퍼티가 자동 생성될 경우 컴파일러는 두 메서드 모두 생성한다.

    • readonly 게터만 사용한다. 그리고 컴파일러는 프로퍼티가 자동 생성될 때에만 게터를 생성한다. 프로퍼티를 외부에 일기 전용으로 공개하고 싶을 때 사용할 수 있으나 클래스 확장 카테고리에서는 내부적으로 읽기/쓰기로 재선언된다. 

  • 메모리 관리 시맨틱

    • 프로퍼티는 데이터를 캡슐화한다. 그리고 그 데이터는 구체적인 소유권 시맨틱이 있어야한다. 이는 오직 세터에만 해당된다. 

      • assign 세터는 CGFloat, NSInteger 같은 스칼라 타입에 사용하는 간단한 대입 연산이다.

      • strong 프로퍼티가 값을 소유한다는 것을 나타낸다. 새로운 값이 설정되면 먼저 그 값을 리테인하고 원래 값은 릴리즈한다. 그런 다음 리테인 한 새 값을 설정한다.

      • weak 프로퍼티가 값을 소유하지 않는 것을 나타낸다. 새로운 값이 설정되면 이 값은 리테인하지 않을 뿐 아니라 이전 값을 릴리스하지도 않는다. 이런 것은 assign과 비슷하지만 프로퍼티가 가르키던 객체는 언제든 파괴될 수 있고 파괴되면 프로퍼티는 nil로 설정된다.

      • unsafe_unretained 이것은 assign과 같지만 타입이 소유하지 않는 관게인 객체 타입일 때 사용된다. 이 관계는 대상 객체가 파괴되었을 때 weak와 다르게 값이 nil로 설정되지 않는다.

      • copy strong과 비슷하게 값을 소유한다고 나타낸다. 그러나 값을 리테인하는 대신 복사한다. 이것은 타입이 캡슐화가 잘 되어 있는 NSString일 때 가끔 사용된다. 세터로 전달된 값이 NSMutableString의 하위 클래스의 인스턴스일 수 있기 때문이다. 이와 같이 값이 가변 객체이면 프로퍼티에 설정된후에 객체의 인지 없이 객체 내용이 변경될 수 있다. 그래서 불변 복사본을 인자로 전달하면 문자열이 객체 내부에서 변경되지 않음을 보장할 수 있다. 가변일 수 있는 객체는 반드시 copy속성을 가져야한다.

출처 :

이펙티브 오브젝티브-C 2.0

 

반응형

'개발 > Objective-C' 카테고리의 다른 글

문자열 포맷 지정  (0) 2020.04.22
오브젝티브씨 isKindOfClass  (0) 2020.04.06
KVO (Key Value Observing)  (0) 2020.02.24
Objective-C id 타입  (0) 2020.02.20
조건문와 반복문  (0) 2020.02.12