본문 바로가기

개발/Objective-C

[Objective-C] 기본 개념 요약

반응형

Objective C 지시어

  • @interface : 클래스 선언
  • @implementation : 클래스 구현
  • @protocol : Delegate 등 일반적인 선언
  • @end : class, category, protocol 종료

선언 지시어

  • @property : 프로퍼티 정의
  • @synthesize : getter, setter 없이 사용할 때 사용하며 @property 에서 정의한 변수를 사용
  • @dynamic : 동적으로 사용하는 메소드와 변수에 사용

특별 지시어

  • @class : 사용자 클래스 선언
  • @selector(name) : 정의된 메소드 이름을 리턴
  • @protocol(name) : 프로토콜 클래스의 인스턴스 리턴
  • @encoode(type) : type의 구조를 인코딩하는 문자열 산출
  • @synchronized() : 하나의 스레드에 의한 코드 블럭 정의시 사용

함수 선언 방식 (interface)

#import <UIKit/UIKit.h>

// public 프로퍼티 / 메소드 선언
@interface MacBook : NSObject {
    NSString *name;
}

// 클래스의 인스턴스 선언
- (NSString *) name;
- (void) setName: (NSString *) newName;

@end

함수 구현 방식 (implementation)

#import "MacBook.h"

@interface MacBook()
    // private 프로퍼티 & 메소드 선언
@end

@implementation MacBook {
    // private 인스턴스 변수
}

/* 메소드 구현 */

// getter 방식 : 메서드 명이 인스턴스 변수 명
- (NSString *) name {
    return name;
}

// setter 방식 : 메서드 명이 set + 인스턴스 변수 명
- (void) setName : (NSString *) newName {
    name = newName;
}

@end

 

프로퍼티 선언

#import <UIKit/UIKit.h>

@interface MacBook : NSObject

@property NSString *name;

@end

// 프로퍼티 접근 방법
_name = @"Mac OS Big Sur";
self.name = @"Mac OS Big Sur";

프로퍼티 구현

#import "MacBook.h"

@implementation MacBook

// Morden Objective-c 이후 synthesize를 사용하지 않는다. (자동 실행)
@synthesize type = _type;
// dynamic은 getter을 직접 설정한다. (안할 시 런타임 에러 발생)
@dynamic version;

@end

// dynamic - getter 설정
- (NSString *) version {
    return @"버전 11.0.1";
}

 

  • @property : 함수 선언에서 사용하며 선언 시 속성이 붙는다.
                         생성 시 자동으로 인스턴스 변수가 생성된다.
                         name 의 이름을 property를 만들었다면 _name 이름의 인스턴스가 생성된다.
  • @synthesize : 함수 구현에서 사용하며 property 명과 생성된 인스턴스 변수 명을 호환시킨다.
  • @dynamic : 함수 구현에서 사용하며 property 생성 후 getter 도 작성할 시 사용한다.

 

프로퍼티 속성

/* 프로퍼티 속성 - 기본 */
@property (readwrite) NSString  *type;		// 기본값. getter, setter 생성
@property (readonly)  NSString  *version;	// getter 생성
@property (getter=newGetName, setter=newSetName:) NSString * name;	// 커스텀 가능

/* 프로퍼티 속성 - 옵셔널 */
@property (nonnull)   NSString  *cost;		// nil 불가
@property (nullable)  NSString  *mouse;		// nil 가능

/* 프로퍼티 속성 - 멀티쓰레드 */
@property (atomic)    NSStirng  *memory;	// Lock 사용 (중복 접근 불가)
@property (nonatomic) NSString  *graphic;	// 중복 접근 가능

/* 프로퍼티 속성 - 참조 카운트 (RC) */
@property (weak)      NSArray   *users;		// ARC 사용시 사용 - 약한 참조 
@property (strong)    NSString  *user;		// ARC 사용시 사용 - 강한 참조 (RC 증가)
@property (assign)    NSArray   *cores;		// 약학 참조
@property (retain)    NSNumber  *power;		// 강한 참조 (RC 증가)
@property (copy)      NSString  *playstore;     // 값 참조 (복사, RC 증가)

 

  • atomic : 쓰레드가 atomic으로 선언된 memory를 사용할 경우 타 쓰레드는 memory에 접근할 수 없다.
  • nonatomic : 쓰레드가 property에 중복 접근 가능히며 성능 향상을 위해 주로 사용된다.
  • assign : 객체가 해제되어도 포인터 값은 변하지 않는다.
  • weak : 객체가 해제되는 시점에 포인터 값은 nil이 된다. 
  • retain : 객체의 소유권을 획득한다. (RC 증가)
  • strong : retain 과 동일하며 ARC를 사용하면 strong을 사용한다.
  • copy : 새로운 객체를 생성한다. (해당 객체의 RC 증가)

Objective c 메모리 관리

  • alloc, new, copy, mutableCopy : 생성, 소유권 획득
  • retain : 소유권 획득 (RC 증가)
  • release : 소유권 포기 (RC 감소)
  • autorelease : 소멸 

 

 

반응형