1. 수식어1 : setter 만들지 말지 여부

 

// 기본 상태 (default)
@property(readwrite) UILabel *resultLabel;
@property UILabel *resultLabel;

// 읽기만 가능 = setter 만들어지지않음
@property(readonly) UILabel *resultLabel;

 

 

 

 

 

2. 수식어2 : 생존기간

 

// 기본 상태 (default)
@property(strong) IBOutlet UITextField *tempText;
@property IBOutlet UITextField *tempText;
// strong 생략해도 기본으로 적용됨
// 객체에 소유권 있음
// 보통 클래스의 인스턴스에서 사용
// retain counter를 하나 증가시킴

// 읽기만 가능 = setter 만들어지지않음
@property(weak) UILabel *resultLabel;
// weak 생략 불가
// 소유권이 없어서, 대상 객체가 해제되면 nil이 됨
// 주소만 참조
// 기본 자료형에 적합합니다. integer처럼!

 

 

 

 

 

3. 수식어3 : 멀티스레드 고려

 

// 기본 상태 (default)
@property(atomic) IBOutlet UITextField *tempText;
@property IBOutlet UITextField *tempText;
// 생략해도 기본으로 적용됨
// 프로퍼티에 접근할 때 lock과 unlock 반복
// 멀티 스레드 환경에서 공유되는 리소스에 사용함

// 읽기만 가능 = setter 만들어지지않음
@property(nonatomic) UILabel *resultLabel;
// nonatomic 생략 불가
// 일반적인 환경에서 빠름

 

 

 

 

 

4. 초기 값 (생략 가능한거 리마인드)

 

// 생략해도 되는 기본설정값
readwrite
strong
atomic

 

 

 

 

 

5. property, synthesize 사용하기

 

 get, setter 소스를 생략해줌

 

// vim MyClass.h

#import <Foundation/Foundation.h>

@interface MyClass : NSObject {
    int howMany;
}

@property int howMany;

-(void)add: (int)howMany;

@end

 

// vim MyClass.m

#import "MyClass.h"

@implementation MyClass

@synthesize howMany;

-(void)add: (int)x {
    howMany += x;
}
@end

 

// vim main.m

#import "MyClass.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // alloc : 메모리 할당
        // init : 초기화
        MyClass *myObjt = [[MyClass alloc] init];
        
        [myObjt setHowMany: 20];
        NSLog(@"%d", [myObjt howMany]);
        
        [myObjt add:5];
        NSLog(@"%d", [myObjt howMany]);
        
        [myObjt add:5];
        NSLog(@"%d", [myObjt howMany]);
    }
    return 0;
}

 

 

 

 

 

6. 심지어 dot notation 사용 가능

 

myObjt.howMany = 20;    // set

my.Objt.howMany;            // get -> 20

// vim main.m

#import "MyClass.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // alloc : 메모리 할당
        // init : 초기화
        MyClass *myObjt = [[MyClass alloc] init];
        
        [myObjt setHowMany: 20];
        NSLog(@"%d", [myObjt howMany]);
        
        [myObjt add:5];
        NSLog(@"%d", [myObjt howMany]);
        
        [myObjt add:5];
        NSLog(@"%d", [myObjt howMany]);
        
        myObjt.howMany= -20;
        NSLog(@"%d", myObjt.howMany);
        
        [myObjt add:10];
        NSLog(@"%d", myObjt.howMany);
    }
    return 0;
}

 

 

 

 

 

7. 생략 가능

 

 - @property를 사용할 경우, @interface에서 선언했던 instance variable을 생략할 수 있습니다.

// vim MyClass.h

#import <Foundation/Foundation.h>

@interface MyClass : NSObject /* {
    int howMany;
}
 >>> instance variable 생략 */

@property int howMany;

-(void)add: (int)howMany;

@end

 

 - 또한 @synthesize도 생략할 수 있습니다. 대신, 해당 변수 활용시 변수명 앞에 _를 사용해야합니다.

// vim MyClass.m

#import "MyClass.h"

@implementation MyClass

// @synthesize howMany;

-(void)add: (int)x {
    _howMany += x;
}
@end

 

 - 물론 해당 변수인 howMany에 외부에서 접근할 경우에는 _를 사용하지 않습니다. m 파일 안에 synthesize를 생략했기 때문에 그 파일 안에서만 작성합니다. 즉, 위 6번 문항의 main.m에서 달라진 내용이 없습니다.

// vim main.m

#import "MyClass.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // alloc : 메모리 할당
        // init : 초기화
        MyClass *myObjt = [[MyClass alloc] init];
        
        [myObjt setHowMany: 20];
        NSLog(@"%d", [myObjt howMany]);
        
        [myObjt add:5];
        NSLog(@"%d", [myObjt howMany]);
        
        [myObjt add:5];
        NSLog(@"%d", [myObjt howMany]);
        
        myObjt.howMany= -20;
        NSLog(@"%d", myObjt.howMany);
        
        [myObjt add:10];
        NSLog(@"%d", myObjt.howMany);
    }
    return 0;
}

 

 

 

+ Recent posts