1. property
변수선언+ setter/getter
set 함수 setAge
get 함수 (int)age
요렇게 쓰고 클래스 변수.age = 10으로 setter호출
클래스 변수.age 로 getter 호출
프로퍼티 말고 멤버 변수 접근할때는 클래스변수 -> age로 접근
2. retain/copy/assign
- retain
@property(nonatomic, retain) NSInteger* number;
라고 선언되있다고 가정하자
retain으로 설정 시 컴파일러는 setter를 생성할 때 다음과 같이 만든다.
-(void) setNumber:(NSInteger*)n
{
if(number!=n)
{
[number release];
number=[n retain];
}
}
빨간 부분이 주목할 곳이다.
새로운 객체를 set해줄 시 기존 객체를 release해준 뒤
새로운 객체에 retain을 한번 호출해준다.
이는 외부에서 그 객체를 release하더라도 객체가 메모리 해제되지 않도록 유지해준다.
- copy
@property(nonatomic, copy) NSInteger* number;
라고 선언되있다고 가정하자
copy로 설정 시 컴파일러는 setter를 생성할 때 다음과 같이 만든다.
-(void) setNumber:(NSInteger*)n
{
if(number!=n)
{
[number release];
number=[n copy];
}
}
copy의 경우 설정하려는 개체의 값을 복사해서 자신이 가지고 있도록 한다.
copy자체가 retain을 한번 호출하기 때문에 따로 retain을 추가로 호출하지 않음.
copy는 값을 복사해 새로운 객체를 만든다.
이로 인해 인자로 전달되는 객체가 자주 변경될 경우 사용하면 좋다.
- assign
@property(nonatomic, assign) NSInteger* number;
라고 선언되있다고 가정하자
assign으로 설정 시 컴파일러는 setter를 생성할 때 다음과 같이 만든다.
-(void) setNumber:(NSInteger*)n
{
number=n;
}
assign은 가장 단순한 방법으로 그냥 값을 대입한다.
이렇게 설정할 경우 외부에서 참조 카운트를 감소시켜 객체가 해제될 위험이 있다.
따라서 이 값은 객체가 아닌 BOOL, int등의 일반값에 대해 적합하다.
-retain, copy등을 사용할 때 메모리 해제
copy와 retain둘 다 retain을 호출한다.
이에 참조 카운터를 증가시킨다.
따라서 dealloc함수에서 release를 해주어야 한다.
-(void)dealloc
{
[number release];
[super dealloc];
}
3. nonatomic/atomic
다중 쓰레드에 대해서 고려할지 말지를 결정
여러 쓰레드가 경쟁적으로 접근하는 프로퍼티라면 atomic사용
그럴 필요 없다면 nonatomic으로 사용
4. 샘플 코드
@interface People : NSObject
//{
// @public
// int age;
//}
//setter와 getter
//-(void) setAge:(int)a;
//-(int) getAge;
//-(int)age;
@property int age;
@end
@implementation People
@synthesize age;
@end
int main()
{
People* p = [[People alloc] init];
// p->age = 10;
p.age = 10;
// [p setAge:10];
// [p getAge];
NSLog(@"%d",p.age);
[p release];
return 0;
}
5. 샘플코드2
@interface Phone : NSObject
-(void)dealloc;
@end
@implementation Phone
-(void)dealloc
{
NSLog(@"phone dealloc");
[super dealloc];
}
@end
@interface People : NSObject
@property (retain, nonatomic) Phone* phone; // 자동 참조계수 증가, 멀티쓰레드에 안전하게(안쓸때는 성능 떨어짐-> nonatomic)
-(void)dealloc;
-(void)foo:(Phone*)ph;
@end
@implementation People
@synthesize phone = _phone;
-(void)dealloc
{
NSLog(@"people dealloc");
[_phone release];
[super dealloc];
}
-(void)foo:(Phone *)ph
{
_phone = ph; //1 <- 멤버 데이터 직접 접근 참조계수 증가 안함
self.phone = ph; //2 <- setter를 통한 접근 참조계수 증가
}
@end
int main()
{
People* peo = [[People alloc] init];
Phone* ph = [[Phone alloc] init];
[peo foo:ph];
NSLog(@"%lu",[ph retainCount]);
peo.phone = ph;
NSLog(@"%lu",[ph retainCount]);
[ph release];
NSLog(@"%lu",[ph retainCount]);
[peo release];
// NSLog(@"%lu",[ph retainCount]);
return 0;
}
'교육 > Objective-C' 카테고리의 다른 글
[Objective-C] kvc(key value coding) (0) | 2016.08.01 |
---|---|
[Objective-C] block (0) | 2016.07.26 |
[Objective-C] 메모리 관리 (0) | 2016.07.26 |
[Objective-C] init (0) | 2016.07.26 |
[Objective-C] target-Action (0) | 2016.07.13 |