NewGen

object-c class 사용법 간단 정리. 본문

IOS

object-c class 사용법 간단 정리.

Deep Learning 2020. 12. 30. 17:55



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

 

대략 위와같이 사용하면 됨.

스위프트에서도 가져다 쓸 수 있슴.

 

좀더 상세하게 보려면.. 아래 링크 참조..

solodevlab.tistory.com/1190

 

iOS - swift 프로젝트에 C++ 소스 임포트 해서 사용하기./ import c++ source in the same swift project.

* 비트연산, 대규모 행렬, 어레이 등등... swift로는 약간 모자른 로직을 구현하기 위해서 c++ 을 사용하거나, object-c를 이용해야 함. * Bit operations, large-scale matrices, arrays, etc... In orde..

solodevlab.tistory.com

 

요즘은 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형으로 인식함.

 

간단한거도 좋지만...

너무 축약을 하면, 유지보수가 어려움.

보기좋고, 쉽게 이해가 가는 코드를 만들어야 함.

기본적으로 많이 사용하는것들만 정리해봄.

 

Comments