- 카운터 관리 방식을 사용할 경우, 자식 스레드 쪽에서는 객체가 누수되는 것을 막기 위해 부모 스레드와는 다른 자동 해제 풀을 만들어 관리할 필요가 있다.

- 스레드 세이프
    -- 여러 개의 스레드가 하나의 인스턴스를 조작할 때 오작동하지 않을 경우, 그 클래스는 스레드 세이프 하다고 말한다. 일반적으로 불변 객체는 스레드 세이프하고 가변 객체는 스레드 세이프 하지 않다. 즉, 가변 객체를 공유하기 위해서는 상호 배제나 동기화를 적절히 사용해야 한다.

- 스레드 생성                                                                                                                               
    -- NSThread                                                                                                                                       + (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument                                                                                                                          
    -- 객체 aTarget에 대한 메소드 호출을 새로운 스레드를 만들어 실행한다. aSelector는 id 타입의 인수를 하나만 사용해서 void를 리턴하는 액션 메소드여야만 한다. 카운터 관리 방식을 사용할 경우 실행되는 메소드 자체가 자동 해제풀을 관리할 필요가 있다. 인수 aTarget과 anArgument에 지정된 객체는 스레드를 만드는 것과 동시에 retain되어 스레드가 종료될때 release된다.

   -- NSApplication                                                                                                             
      --- + (void)detachDrawingThread:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
         ---- 위에 NSTherad의 스레드 생성 메서드를 사용하는데, 카운터 관리 방식일 경우 스레드를 위한자동 해제 풀을 만든다.
      --- + (BOOL)isMultiThreaded                                                                                                
          ---- 여러 개의 스레드가 병행으로 동작하고 있거나 그 시점에서 메인 스레드 밖에 없더라도 이제까지 스레드가 생성된 적이 있다면 YES를 리턴.

- 상호 배제
    -- 여러 개의 스레드 사이에서 전역 변수와 같은 공유 자원의 상호 배제를 하기 위해 NSLock 클래스를사용.
    -- Lock은 프로그램이 멀티 스레드로 동작하기 전에 만들어져야 함.
        --- 어떤 락에 대해 lock이 실행 되면 그 후 반드시 unlock을 1회만 실행해야 한다. lock을 한 후 unlock을 사용하는 것은 같은 스레드에서 해야함.                                                                          
    -- (void)Lock
        --- P조작: 락이 사용 중이라면 스레드는 휴면상태에 들어감. 사용중이 아니라면 락을 사용 중으로 바꾸고 실행을 계속함
    -- (void)unLock
        --- V조작: 사용 중이던 락을 해제, 그 락을 획득하기 위해 휴면 상태에 있는 스레드가 있다면 그 스레드가 해제된 락을 획득
                                                                                                       
    -- (BOOL)tryLock
        --- 리시버인 락 획득을 시도하고 획득을 성공한 경우 YES를 리턴함, 실패한 경우 휴면 상태에 들어가지 않고 NO를 리턴한 후, 실행을 계속함.

'IOS > Objective-C' 카테고리의 다른 글

Collections의 weak reference  (0) 2016.10.02
NSString과 NSMutableString의 copy  (0) 2016.02.18
메소드의 동적 결합  (0) 2015.08.22
Property List  (0) 2015.08.20
Archive  (0) 2015.08.20
Posted by 홍성곤
,

- Objective-C에서는 런타임 시스템의 기능을 사용해서 클래스의 일부 메소드를 런타임에 추가하거나 교체하는 것이 가능함. 

- 단 지나치게 남용하면 유지보수하기 어려움. 

- 최후의 수단으로 사용할 것을 권함.


- @dymamic을 지정한 프로퍼티는 이에 대응하는 접근자 메소드를 클래스에서 정의할수도 있지만, 정의하지 않아도 런타임에 함수를 동적으로 결합하는 것이 가능함.

- Objective-C의 메소드는 IMP 타입으로 표현되는 C함수이다. 첫번째 인수가 self(id타입), 두번째 인수가 SEL이 되어야 함.

- BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types);

    - cls는 바인딩시키코 싶은 클래스이고, name은 메소드의 셀렉터, imp는 함수의 포인터, types는 함수의 타입 정보를 나열한 것이다. 바인딩에 성공한 경우 YES를 리턴.

- 실제 바인딩 하기

    - -(void)setList:(NSArray *)obj ----> void set_list(id, SEL, NSArray *)(프로토 타입) 

    - class_addMethod(self, @selector(setList:). (IMP)set_list, "v@:@"); 로 함수 바인딩(클래스 메소드 안에서 호출할 경우 첫번쨰 인수에 self를 집어넣으면 됨)


* @encode() 

 - Objective-C는 객체를 동적으로 다루는 일이 많아 데이터를 보존하거나 통신을 할 때, 그 데이터가 실제로 어떤 데이터 타입이라는 정보를 알려줘야 하는 경우가 있다.  

 - Objective-C는 데이터 타입을 표현하기 위해 C문자열(const char*)의 타입 코드를 사용하지만, 타입에서 문자열을 쉽게 얻을 수 있도록 @encode()라는 컴파일러 지시자가 제공됨.

 - @encode()는 인수로 타입명을 받아 컴파일할 떄 대응하는 타입으로 교체를 한다. 예를 들어 @encode(int)는 'i'가 되고, @encode(NSSize)는 '{_NSSize=ff}'가 된다.

 - 주요타입의 표

 코드

데이터 타입 

 c 

 char

 s

 short

 i

 int 

 l

 long 

 q

long long 

 f

 float 

 d

 double 

 C

 unsigned char 

 S

 unsigned short 

 I

 unsigned int 

 L

 unsigned long

 Q

 unsigned long long 

 V

 void 

 *

 C문자열(char *) 

 @

 객체 

 #

 킄래스 객체 

 :

 셀렉터 

 [타입]

 배열 

 {이름=타입...}

 구조체 

 ^타입

 타입의 포인터 

 ?

 정해지지 않은 타입이나 요소 


'IOS > Objective-C' 카테고리의 다른 글

NSString과 NSMutableString의 copy  (0) 2016.02.18
멀티 스레드 프로그램  (0) 2015.08.23
Property List  (0) 2015.08.20
Archive  (0) 2015.08.20
Copy  (0) 2015.08.18
Posted by 홍성곤
,

Property List

IOS/Objective-C 2015. 8. 20. 21:06

Cocoa 환경에서 여러 정보를 표현하고, 보존하기 위해 사용하는 표준적인 데이터 형식.

- ASCII, XML, 바이너리 형식의 세 종류 형식을 사용할 수 있음.

   - ASCII : NSString, NSData, NSArray, NSDictionary 표현 가능.

   - XML : 위의 네가지 + NSNumber, NSDate

   - 바이너리 : 위와 같은 형식을 텍스트가 아닌 바이너리 파일로 보존함.


- ASCII 형식의 Property List에서는 NSArray, NSDitionary의 인스턴스에 대해 description 메서드를 사용해서 문자열 형식으로 값을 얻을 수 있고, 이를 다시 객체의 구조로 복원하기 위해서 propertyList메서드를 사용해서 복원할 수 있다.

- XML 형식의 Property List에서는 NSArray, NSDictionary에 대해 writeToFile:atomically:를 사용해서 XML 형식의 프로퍼티 리스트를 파일에 쓸 수 있다. 파일에서 다시 객체로 복원하려면 initWithContentsOfFile을 사용해서 복원.

- 클래스 타입과 프로퍼티 리스트의 문자열 표현

  클래스

 XML 형식의 태그  

 ASCII 형식의 데이터 표현 

 NSString 

 <string> 

 "문자열" 

 NSNumber 

 <integer>, <real>, <true/>, <false/> 

  없음 

 NSData

 <data> 

 <16진수> 

 NSDate 

 <date> 

  없음 

 NSArray 

 <array> 

 (요소, 요소, ...) 

 NSDictionary 

 <dict> 

 {키 = 값; 키 = 값} 


- 프로퍼티 리스트의 변환과 검증

세 종류의 프로퍼티 리스트를 서로 변환하거나 형식을 검증하기 위한 클래스 NSPropertyListSerialization이 제공됨. 프로퍼티 리스트를 복원해서 얻는 객체의 구조를 가변 객체로 구성하는 것도 가능.

'IOS > Objective-C' 카테고리의 다른 글

멀티 스레드 프로그램  (0) 2015.08.23
메소드의 동적 결합  (0) 2015.08.22
Archive  (0) 2015.08.20
Copy  (0) 2015.08.18
Zone  (0) 2015.08.18
Posted by 홍성곤
,