티스토리 툴바


IT낙서/cocos2d2011/08/08 21:00

[새 버전 install]
./install_template.sh -f 로 인스톨
-f 옵션은 같은 디렉토리가 있다면 덮어쓴다.

[기존 template 제거]
/Library/Application Support/Developer/Shared/Xcode/Project Templates/
아래에 템플릿이 설치되므로 해당 버전만 삭제하시면 됩니다.

/Library/Application Support/Developer/Shared/Xcode/File Templates/
프로젝트 템플릿과 파일템플릿 모두 제거하시면됩니다.

Posted by 빵원군
TAG cocos2d
IT낙서/Objective C2010/09/09 20:06
Cocoa에서는 동적으로 확보되는 메모리를 관리하기 위해 존(zone)이라는 영역을 사용합니다.
교과서적인 메모리 관리 방식에서는 동적인 메모리를 할당하기 위한 영역으로 하나의 큰 힙(heap) 영역을 사용합니다. 이 방법을 이용하면 메모리를 확보하고 해제를 반복할 경우, 서로 관계가 있는 내용의 데이터가 메모리 상에서는 멀리 떨어진 곳에 흩어질 가능성이 있습니다.


그래서 메모리 공간에 여러 개의 힙을 만들어 서로 밀접한 관계에 있는 데이터나 객체는 특정 힙 내에서 메모리가 할당되도록 합니다. 이렇게 함으로써 공간적인 국소 참조성(프로그램 코드나 데이터로의 접근이 메모리 상의 가까운 위치에 집중적으로 발생하는 경향을 의미함. 가상 메모리 캐쉬의 기초가 되는 원리)을 살린 효율적인 메모리 접근이 가능합니다.

이렇게 메모리 상에 만들 수 있는 힙 영역을 존이라고 부릅니다. 존은 각각 메모리 관리 기능이 있고, 필요에 따라 그 크기가 증가합니다. 프로그램이 실행된 직후부터 존재하는 존을 디폴트 존(default zone)이라고 합니다. 그리고 따로 지정하지 않을 경우 인스턴스 객체는 이 존에 만들어집니다.

존은 메모리 접근의 효율을 고려해서 만들어진 개념입니다. 그런데 일반적인 경우 디폴트 존 만으로도 실행 시 충분한 효율이 나오기 때문에 최근 Apple의 문서에서는 이 기능을 적극적으로 소개하지는 않습니다. 그리고 가비지 컬렉션을 사용하는 경우 객체를 생성할 때 존을 지정하는 것이 불가능합니다.



일반적으로 인스턴스 객체의 생성은 클래스 메소드 alloc을 사용하지만, 이 경우 인스턴스는 디폴트 존에 만들어집니다. 존을 지정해서 인스턴스를 생성하기 위해서는 클래스 메소드 allocWithZone:을 사용합니다.

+(id)allocWithZone:(NSZone *)zone;
생성한 인스턴스에 대한 오너쉽 처리는 alloc을 사용할 때와 같습니다. NSZone 타입은 존을 표현하기 위한 데이터 구조로 zone이 NULL인 경우 인스턴스는 디폴트 존에 생성합니다. 가비지 컬렉션을 사용하는 경우 인수 zone은 무시되고 alloc을 사용하는 경우와 동일하게 동작합니다.

NSObject에는 copy라는 메소드가 제공되는데 리시버를 복사해서 새로운 인스턴스를 만드는 것이 가능합니다. 단, 실제로 복사 처리를 하는것은 copy가 아니라 copyWithZone:이라는 인스턴스 메소드입니다. 인스턴스 객체에 copy메시지를 보내면 인수로 NULL을 지정해서 자기 자신의 copyWithZone:을 호출합니다. 이렇게 함으로써 디폴트 존에 새로운 인스턴스를 만들수 있습니다.


이런 원리로 되어 있기 때문에 인스턴스가 복사되도록 하기 위해서는 copy 메소드가 아닌 copyWithZone: 메소드를 정의해야합니다. 메소드 copyWithZone:의 리턴값은 복사해서 새로 생긴 새로운 객체인데, 만약 복사가 실패했을 경우는 nil을 리턴합니다. copy의 리턴값도 마찬가지입니다.

메소드 copyWithZone:은 이것만 포함하는 프로토콜 NSCopying 내에서 선언되어 있으므로 클래스에서 이 프로토콜을 적용해서 메소드를 구현합니다.

@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end




'IT낙서 > Objective C' 카테고리의 다른 글

Objective C 이야기 - zone  (0) 2010/09/09
Objective C 이야기 - BOOL  (0) 2010/04/28
Objective C 이야기 - Hello Objective C  (0) 2010/04/28
Posted by 빵원군
IT낙서/Objective C2010/04/28 01:50
오브젝티브-C에서 BOOL은 실제로 8비트의 저장 공간을 갖는 부호 있는 문자(signed char) 타입을 단지 형 정의(typedef)한 것이다. YES는 1로 정의되어 있고 NO는 0으로 정의되어 있다.(#define 사용). 오브젝티브-C는 BOOL을 YES나 NO의 값만을 담을 수 있는 진정한 Boolean 타입으로 여기지 않는다. 만일 1바이트보다 큰 값의 정수(예를들면 short나 int 값 등)를 BOOL 변수에 넣는다면, BOOL 변수의 값에서 하위 바이트만 사용한다. 하위 바이트가 0인 경우(예를들어 8960, 16진수로 0x2300등) BOOL 값은 0, 즉 NO값이 된다.

연구해보자..
아래 함수는 2개의 int값을 받아서 값이 같다면 NO를 값이 다르다면 YES를 리턴시킨다.
경험많은 C프로그래머라면 이 함수를
BOOL areIntsDifferent(int thing1, int thing2)
{
  if(thing1 == thing2){
    return NO;
  }
  else {
    return YES;
  }
}

아래와 같이 줄여쓸수도 있다.
BOOL areIntsDifferent(int thing1, int thing2)
{
  return (thing1 - thing2);
}
별 문제없다.
헌데 이 함수를 사용할때 주의해야 하는데..
if (areIntsDifferent(23, 5) == YES)
{
   // ...  참값??
}
만약 이런식으로 사용한다면 areIntsDifferent 함수가 리턴하는 값은 23 - 5 인 18이 될테지만.. YES(1) 값과 틀려 거짓으로 판단한다. 그럴땐 아래와 같이 사용하면 된다.
if (areIntsDifferent(23, 5))
{
   // ...  참값
} 
// 또는
if (areIntsDifferent(23, 5) != NO)
{
   // ...  참값
}

NSLog의 %@형식지정자?

NSLog 함수를 사용하다보면 %d, %s같은 형식지정자를 볼수 있다. %@ 이런 형식지정자가 있는데 무슨 의미일까? NSLog()를 만든 사람들은 문자열에서 문자를 사용하고 콘솔에 출력하도록 보내는 NSString처럼 적절한 인수를 받아들이는 NSLog()명령에 %@형식 지정자를 추가했다.

NSLog()를 사용해서 어떤 객체의 값을 출력할 때, %@ 형식지정자를 사용한다. 이 식별자를 사용할 때, 객체는 decription이라는 이름의 메소드를 통해 자신의 NSLog() 형식을 제공한다. NSString의 description 메소드는 단순히 문자열의 문자들을 출력한다.

'IT낙서 > Objective C' 카테고리의 다른 글

Objective C 이야기 - zone  (0) 2010/09/09
Objective C 이야기 - BOOL  (0) 2010/04/28
Objective C 이야기 - Hello Objective C  (0) 2010/04/28
Posted by 빵원군