본문 바로가기

OBJECTIVE-C

[Objective-C] Property 정리[출처] [Objective-C] Property 정리

[Property Attribute]


 readonly

 Property가 Immutable로 선언된다. @synthesize 선언 시 getter 만 생성한다.

 readwrite와 상호배타적이다.

 readwrite

 Property가 mutable로 선언된다. @synthesize 선언 시 getter, setter 생성

 readonly 와 상호배타적이며 디폴트이다..

 copy

 객체의 복사본을 setter에 전달하고 복사본의 참조를 저장하게 setter를 선언한다.

  assign, retain 과 상호배타적이다. 

 assign

 원본의 포인터를 설정하도록 setter 선언한다.

 copy, retain 과 상호배타적이다. 아무 선언이 없을 시 assiign로 가정되나 몇 가지    경우에는 명시적으로 선언해야 한다. 

 retain

 assign과 유사하나 객체의 레퍼런스를 retain 한다. Managed memory 환경에서만 의미가 있다.

 getter=name

 getter의 이름을 변경할 수 있다. 다만 표준 getter, setter 네이밍 규칙을 지키지 않으므로 Key-Value Coding 에서 이 Property를 인지하지 못한다.

 setter=name

 setter의 이름을 변경할 수 있다. readonly에서 설정할 수 없고 getter와 동일하게 Key-Value Coding 에서 인지 못하는 문제가 있다.

 nonatomic

 thread-safe를 설정하지 않는 것으로 IOS 경우 성능향상이 있다.



[기본형]


@interface AllWeatherRadial : Tire {

    float rainHandling;

    float snowHandling;

}


@property float rainHandling;  // 기본형, readwrite, getter/setter 생성



[읽기전용]


@property (readonly) float rainHandling;



[copy]


객체의 경우 특히 문자열 경우 사용하는 경우가 많다(일반형일 때는 디폴트가 복사이기 때문에 의마가 없다) 순환참조에 의한 메모리 릭 발생을 예방하고 다른 곳에서 원본을 변경할 때 side effect를 예방한다.


@synthesize으로 생성되는 setter/getter는 아래와 유사한 형태이다.


@property (copy) NSString* name;


-- m 파일 --

@synthesize name;


-(void)setName:(NSString*)newName {


    [name release];

    name = [newName copy];

}



-(NSString*)name {

    return name;

}



[retain]


객체의 참조횟수를 증가시킨다.


@synthesize으로 생성되는 setter/getter는 아래와 유사한 형태이다.



@property (copy) NSString* name;


-- m 파일 --

@synthesize name;



-(void)setName:(NSString*)newName {



    [name release];

    name = [newName retain];

}





-(NSString*)name {

    return name;

}



[이름변경 및 기타]


@interface Person : NSObject {

    NSString* firstName;

    NSString* secondName;

    BOOL      adult;

}


@property (copy) NSString* firstName;

@property (copy) NSString* lastName;

@property (getter=isAdult) BOOL adult; // getter 이름 변경

@property (readonly, nonatomic) NSString* fullName;


-- m 파일 --

@synthesize firstName;

@synthesize lastName = secondName; // 다른 이름 사용

@synthesize adult;


getter/setter 의 이름을 변경한 경우 .연산자를 사용할 수 없고 이것 때문에 Key-Value Coding을 사용할 수 없다.


변수명과 다른 property 명을 사용할 수 있다. 다만 클래스 내부에서 .연산자를 이용할 경우에는 self.secondName = @"XXX" 으로 사용해야 한다. 


@synthesize 선언없이 직접 구현도 가능하다. 위의 fullName의 경우 아래와 같이 구현하면 된다.


-(NSString*)fullName {

// 구현

...............................

}



참고서적 : Learn Object-C on the Mac

          Learn Object-C for Java Developers