NewGen
object-c class 사용법 간단 정리. 본문
Obj-c 클래스 생성 및 호출이용
클래스 선언 기본
@interface Custom_Class_Name : SuperClass_Name
{
//변수
}
+(void)func1: (int)in_num; //+ c++에서 static
-(void)func2 : (NSString*)in_str; //- : general class member func.
@end
* Header file
#ifndef test_objc_h
#define test_objc_h
#import <Foundation/Foundation.h>
@interface testObjClass : NSObject
{
NSString* str1; //ARC mode on이므로 자동으로 메모리 관리가 들어감.
NSString* str2;
int nNum1;
NSString* testStr1;
}
//인스턴스 변수 속성정의
//property속성을 지정한 변수들은 ARC모드 on이면 자동으로 dealloc됨.
//property 설정해주면, m파일에서 synthesize로 받아주어야 함.
@property (readwrite, atomic) NSString* str2;
@property (readwrite, atomic) int nNum1;
@property (readwrite, nonatomic) NSString* testStr1;
-(void)setStr1: (NSString*)in_str;
-(void)setnNum1: (int)in_Num;
-(void)changeStr2;
-(NSString*)getStr1;
-(void)enter_testStr1: (NSString*) in_str;
//-(id)init; // 헤더에 기술하지 않아도, m파일에서 구현해주면 클래스 생성될때 자동 실행됨.
@end
m 파일
대략 이래 사용함.
@implementation Custom_Class_Name
//멤버함수 구현..
@end
#import "test_objc.h"
@implementation testObjClass
//헤더파일에서 property속성 정의한 변수들의 접근자 생성.
@synthesize str2;
@synthesize nNum1;
@synthesize testStr1;
-(id)init
{
NSLog(@"testObjClass init ============");
if(self = [super init])
{
testStr1 = @"testStr1 init";
[self setStr1: @"init str1 - not synthesized"];
}
NSLog(@"testObjClass init : str1=[%@]",str1);
return self;
}
-(void)setStr1:(NSString *)in_str
{
NSLog(@"setStr1 : in_str=[%@]", in_str);
str1 = [NSString stringWithString:in_str]; // 인스턴스 생성.
NSLog(@"setStr1 : str1 = [%@], str2 = [%@]", str1, str2);
str2 = str1;
NSLog(@"setStr1 : str1 = [%@], str2 = [%@]", str1, str2);
}
-(void)setnNum1:(int)in_Num
{
NSLog(@"setnNum1=[%d]",in_Num);
nNum1 = in_Num;
}
-(void)changeStr2
{
str2 = @"Changed String by function changeStr2()";
NSLog(@"str2 = [%@]\n",str2);
NSLog(@"str1 = [%@]\n",str1);
}
-(NSString*)getStr1
{
NSLog(@"getStr1() : str1 = [%@]\n",str1);
return str1;
}
-(void)enter_testStr1:(NSString *)in_str
{
NSLog(@"enter_testStr1() : init ?? testStr1 = [%@]\n",testStr1);
testStr1 = in_str;
NSLog(@"enter_testStr1() : testStr1 = [%@]\n",testStr1);
}
//-(void)dealloc
//{
// self.str2 = nil;
// self.testStr1 = nil;
// NSLog(@"dealloc() : testStr1 = [%@]\n",testStr1);
//}
@end
대략 위와같이 사용하면 됨.
스위프트에서도 가져다 쓸 수 있슴.
좀더 상세하게 보려면.. 아래 링크 참조..
요즘은 Swift를 쓰면 메모리 관리는 자동으로 되기 때문에, 초기처럼 init 형태의 구문을 잘 쓰지 않는거 같음.
실제로 나도 잘 안씀..
그리도 또 요즘은... property 설정시... assign, retain, copy 이런거 안쓰는듯.. 한참된듯함..
자동으로 관리하기 시작하면서부터.. strong 이냐 weak이냐만 구분해서 쓰는듯..
* strong , weak
strong.
- 코드적으로 해제되어야 메모리에서 해제됨.
- 예를들어 뷰컨트롤러에서 선언해서 쓰면, 뷰화면은 사라져도 메모리상에 strong 선언한 변수는 존재.
- 확실하게 해제를 해줘야 하고, 정확한 해제 시점을 정할 수 있슴.
weak
- 사용될때만 생성되고, 이후는 자동으로 제거.
- 예를들어 뷰 사라졌다가... 다시 보여줘야 하는데, 이 때 weak형 변수가 nil 일수도 있슴.
- 메모리관리는 자동으로 해줘서 편하기는 하나, 재호출이 반복되면 nil 값으로 crash 될수도 있슴.
* atomic , nonatomic
atomic
- 기본값.
- 멀티쓰레드에서는 atomic으로 선언해주어야, 다른 쓰레드에서 접근시 뮤텍스 적용되서 값충돌을 막아줌.
notatomic
- 쓰레드 안쓰고 싱글로만 처리할때,
- 주로 시퀀셜한 로직에서 사용.
* typealias (swift)
- 본인이 타입형을 선언해서 코딩을 해야 할때 편리.
- 예 ) Int 형을... 나으Int형으로 하고 싶을때
typealias MyInt = Int
typealias CustomInt = Int
저렇게 선언하면 MyInt, CustomInt,를 Int형으로 인식함.
간단한거도 좋지만...
너무 축약을 하면, 유지보수가 어려움.
보기좋고, 쉽게 이해가 가는 코드를 만들어야 함.
기본적으로 많이 사용하는것들만 정리해봄.
'IOS' 카테고리의 다른 글
Xcode 버전에 따른, AppDelegate.swift @main annotation 처리. (0) | 2021.01.25 |
---|---|
알고리즘 연습 iOS / Stack, Queue (0) | 2021.01.09 |
ios - 알고리즘연습 - 스택/큐 (0) | 2020.12.28 |
ios - array 일괄계산 (0) | 2020.12.28 |
iOS - swift 프로젝트에 C++ 소스 임포트 해서 사용하기./ import c++ source in the same swift project. (0) | 2020.12.26 |