어흥

[Objective - C] 기본 개념 본문

iOS

[Objective - C] 기본 개념

라이언납시오 2020. 9. 24. 16:26
728x90
반응형

1. Method 설정 방법

- '-'를 사용한 Instance Method의 경우, self를 사용하여 호출을 한다 -> 다른 외부에서 접근 불가

- '+'를 사용한 Class Method의 경우, 선언한 Class 이름을 앞에 붙여서 Method 호출이 가능

//Test.h 파일
@interface Test: UIViewController

- (void)abc;
+ (void)def;

@end

//Test.m 파일
#import "Test.h"

@implementation Test

- (void) viewDidLoad {
    [super viewDidLoad];
    Test *vc = [[Test alloc] init];
    [vc def]		//[vc abc]는 불가능
    [self abc]
}

@end

 

 

2. .h, .m 파일

- .h: Interface와 비슷한 형태로, 선언만 한다. 특정 값으로 변수 초기화 불가능(0 or nil로 자동 초기화)

- .m: .h에 작성했던 함수 구현 + 이외 함수나 기타 기능 구현

 

 

3. 변수 여러개 함수 + 실행

//Test.h 파일
@interface Test: UIViewController

- (void)abc: (NSString *)str1 name2:(NSString *)str2;
+ (void)def: (NSString *)str1 :(NSString *)str2;

@end

//Test.m 파일
#import "Test.h"

@implementation Test

- (void) viewDidLoad {
    [super viewDidLoad];
}

- (void)abc: (NSString *)str1 name2:(NSString *)str2 {
	NSLog(@"%@ and %@", str1, str2);
}

+ (void)def: (NSString *)str1 :(NSString *)str2 {
	NSLog(@"%@ and %@", str1, str2);
}
@end


//함수 호출
[self abc:@"James" name2:@"Hellen"];		//James and Hellen
[self def:@"James" :@"Hellen"];			//James and Hellen

 

4. @property(전역변수랑 비슷)

- 이외의 변수들은 protected type이다

- @interface ~ @end : 선언부(전역변수, 프로퍼티 선언)

- @implementation ~ @end : 구현부

 

//Test.h 파일
@interface Test: UIViewController

- (void)abc;
+ (void)def;

//property
@property int cnt;

@end

//Test.m 파일
#import "Test.h"

@implementation Test

- (void) viewDidLoad {
    [super viewDidLoad];
    
    Test *vc = [[Test alloc] init];
    //.으로 접근
    NSInteger cc = vc.cnt;
    vc.cnt = 5;
    
    //getter & setter
    NSInteger cc = [vc cnt];
    [vc setCnt: 3];
}

@end

 

4-1. @property(weak,nonatomic)

  [weak자리에 오는 특성]

    - read/write

    - read-only

    - strong : 객체 값을 직접 사용할 때 필요(객체를 참조하는 강한 포인터가 있으면 활성 상태로 유지)

    - weak: 참조된 객체를 alive 상태로 유지하지 않는다

    - copy: 단순한 값이 아니라 어떤 값의 사본이 필요할 때 사용한다

 

  [nonatomic]

    - nonatomic 특성을 추가하면 Mutex(Mutual Exclusion) 관련 기능을 컴파일러가 추가하지 않는다

    - 멀티쓰레드 환경에서 사용 X -> 원자성 유지가 낭비 -> nonatomic으로 설정

    - Mutex란? 임계구역을 가진 쓰레드들의 Running time이 겹치지 않게 단독으로 실행되게 하는 기술

 

 

5. @synthesize

- Property에만 적용된다

- self. 으로 호출하는 경우에는 차이가 없지만, 변수 이름으로 직접 접근하는 경우 차이가 발생한다(2개의 멤버 변수가 선언되었기 때문)

 

[synthesize 적용X]

//test.h 파일
@interface ViewController : UIViewController

@property NSString *name;

-(void) varTest;

@end

//test.m 파일
#import "test.h"

@implementation ViewController
-(void) varTest
{
    self.name = @"testing";		//에러 X
    _name = @"testing";			//에러 X
    name = @"testing";			//에러	
}

[synthesize 적용]

//test.h 파일
@interface ViewController : UIViewController

@property NSString *name;

-(void) varTest;
-(void) setName;
@end

//test.m 파일
#import "test.h"

@implementation ViewController
@synthesize name;
-(void) varTest
{
    self.name = @"testing";		//에러 X
    _name = @"testing";			//에러
    name = @"testing";			//에러 X
}

-(void)setName: (String)newName {
	self.name = newName;		//무한루프 발생(계속해서 자기자신 호출)
}

 

[참고 블로그]

- hyerios.tistory.com/98?category=853360

- nsios.tistory.com/4

- babbab2.tistory.com/24

- asfirstalways.tistory.com/281

- sharphail.tistory.com/59

 

728x90
반응형

'iOS' 카테고리의 다른 글

[Objective-C] 문자열, 파일, 프로토콜  (2) 2020.10.15
[Objective-C] 기본 내용 2  (0) 2020.10.14
[Swift] Animation  (0) 2020.09.15
[Swift] CollectionView  (0) 2020.09.15
[Swift] Segue - 데이터 전달  (2) 2020.09.10
Comments