어흥
[Objective - C] 기본 개념 본문
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
- asfirstalways.tistory.com/281
'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 |