C 언어계얼 소스코드를 보다보면 종종 아래와 같은 소스를 볼 수 있다.

#define M do {printf("hello");printf("world");} while(0)

 

처음에 이 코드를 보았을때에는 컴파일러가 무슨 장난을 치는구나 라고 생각했는데..

이유는 의외로 단순했다.

 

먼저 위와 같은 역할을 하도록 매크로를 짜보자.

 

<첫번째>

#define M printf("hello");printf("world")

이것은 아래와 같은 if 조건이 있을대 오류가 난다.

if (condition)
     M;
else
     printf("!!!");


<두번째>

그렇다면 중괄호로 묶으면 안될까?

#define M {printf("hello");printf("world");}

 

이것은 첫번째와 같은 조건식에 넣었을때 세미콜론 때문에 오류가 나겐된다.

 

if (condition)
    M
else
    printf("!!!");

이와 같이 쓴다면 문제 없이 돌아간다.

하지만 대부분의 프로그래머가 줄 맨 끝에 세미콜론을 쓰는것이 익숙하기 때문에 저런 방식은 오류를 유발할 확률이 높다.

 

그래서 결국 위와같이 do while(0) 을 사용하게 되는것이다.

원문 : http://guntn.blog.me/100045877821

 

 

 

 

by cranix 2010. 12. 13. 18:39
싱글톤 인스턴스는 객체의 인스턴스가 오직 하나만 존재하는것을 보장하도록 코딩하는것을 말한다.
자바에서는 private 생성자를 이용해서 만들면 되었지만 ObjectiveC 에서는 그게 불가능하기 때문에 아래와 같은 방법을 쓴다.

#import "TemperatureConverterBO.h"



static TemperatureConverterBO *instance = nil;



@implementation TemperatureConverterBO



+ (TemperatureConverterBO *)getInstance {

@synchronized(self) {

if (instance == nil) {

instance = [[TemperatureConverterBO alloc] init];

}

}

return instance;

}


+(id)allocWithZone:(NSZone *)zone {

@synchronized(self) {

if (instance == nil) {

instance = [super allocWithZone:zone];

return instance;

}

}

return nil;

}


-(id)copyWithZone:(NSZone *)zone {

return self;

}

-(id)retain {

return self;

}

-(unsigned)retainCount {

return UINT_MAX;

}

-(void)release {

}

-(id)autorelease {

return self;

}


@end


이 방법은 alloc 을 불러도 한번 생성되었으면 더이상 생성되지 않는다.
그리고 retainCount 가 맥스값이 나가기때문에 GC 에 의해 해제되지 않는다.
결국 하나의 인스턴스를 보장한다.

by cranix 2010. 11. 30. 18:37
| 1 |