'오브젝티브C'에 해당되는 글 3건

최초 작성일 : 2013/03/19 09:00 


출처 : http://blog.jidolstar.com/trackback/842



NSArray - array =  @[ a, b, c ];

NSDictionary - dict = @{ k1 : o1, k2 : o2, k3 : o3 };
-> 요건 기존 딕셔너리 생성이 value, key 형식으로 코딩을 해야 해서
    좀 혼란스러웠는데 이렇게 쓰니까 key/value 순서에 맞게 되어 편하네요.

NSNumber *number;

number = @'X'; //char

number = @12345; //int

number = @12345ul; //unsigned long

number = @12345ll; //long long

number = @123.45f; //float

number = @123.45; //double

number = @YES; //bool

블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요

최초 작성일 : 2010/04/16 13:26 






열거형 상수인 enum은 객체의 상태를 정의하거나 속성을 정의하기 위해 많이
쓰이는데요. 위의 1, 2의 예와 같이 상수 값을 할당하는 방법이 다릅니다.

1번은 그냥 정수값으로 할당을 하였고 2번은 shift연산 혹은 16진수 표기법으로
할당을 하였습니다. 이 두 가지의 차이점이 무엇일까요?

다음의 내용은 네이버 '맥부기 아이폰OS 개발자모임'카페의 artiechoi께서
정리해주신 내용입니다.

단순한 이유이지만 전산학에서 매우 중요한 이유입니다.
0,1,2로 진행시키는건 그냥 하나만 선택할 때 쓰입니다. 상호배타적이라 표현하구요.
radio버튼 생각하면 됩니다.

linear하게 증가하지 않고, 비트단위로 증가된다면 이는 여러 개 선택할 수 있게 하기 위함입니다.
checkbox개념이죠. or 연산(|)으로 이렇게 할수 있습니다. 주로 속성같은것 정의할때 이렇게 많이 합니다.

StateHighlighted|StateDisabled 이렇게 하면
하이라이팅이면서 디스에이블드 되었다는 의미이죠
 이렇게 or연산이 되어야 하기 때문에, 비트단위로 서로 구분되어야합니다. 이론상, int가 4byte이면,32개까지 열거할 수 있겠지요. (참고로, 위의 예에서 0은 노말이므로, 노멀고 어떤 것고 or해도 모두 무시됩니다. )

0x000001, 0x000002, 0x000004, 0x000008, ... 이렇게 2의 n승으로 정의된것들도 모두 같은 의미입니다.
(1을 하나씩 왼쪽으로 shift하는 것이 2의 n승이므로)

정리하면 그냥 정수로 할당한 것은 한 번에 한가지의 상태밖에 가질 수 없는, 즉
어떠한 '상태'를 표현하기 위해 주로 쓰이고 shift연산을 사용한 것은 객체의 '속성'을
표현하기 위해 주로 사용된다고 보시면 되겠네요.

예를들어 1번의 예는 객체 내에서의 콘텐트의 가로 정렬을 표현하는 열거형 상수입니다.
즉, 우측 정렬인지, 좌측 정렬인지, 중앙 정렬인지, 양끝 정렬인지...
이러한 내용들은 한 번에 하나 밖에는 가질 수 없는 상태입니다. 따라서 그냥
정수로 상수값을 할당해서 하나만 선택하게 한 것이죠.

하지만 2번의 경우 어떤 Control 객체의 속성을 열거형 상수로 정의해놓은 것인데요.
보면시 Highlight 속성, Disable 속성, Select 속성 3가지가 shift연산으로 정의되어
있습니다. 즉, 이 컨트롤은 이 세가지 속성중에 하나 이상을 중복해서 가질 수 있다는
말입니다. 하이라이트됨과 동시에 비활성화되어있을 수도 있고, 선택된 상태에서
하이라이트 될 수도 있는 것이죠. 이렇게 중복해서 가질 수 있는 속성은 나중에
실 사용에서 비트 or(|) 연산으로 연결됩니다.

이 내용을 전산적으로 볼까요?

1번의 경우입니다.
우선 정수를 2진수로 표현해보죠.
1 -> 0001
2 -> 0010
3 -> 0011
이런 경우 or(|) 연산을 하면 어떻게 될까요?
1 | 2 = 0011
1 | 3 = 0011
2 | 3 = 0011

네...모두 3만 나오네요. 결국 정수로 값이 할당된 상수들은 or(|) 연산을 해봐야
가장 큰 값밖에 안나오므로 한 번에 하나의 값만을 선택해서 사용할 수밖에 없습니다.

그럼 2번의 경우는 어떨까요? << 연산자는 좌측의 값을 우측의 값만큼 오른쪽으로
이동시키라는 비트 연산자죠? 다음과 같습니다.

1<<0 = 0001
1<<1 = 0010
1<<2 = 0100

이 값을을 가지고 or(|) 연산을 해볼까요?

(1<<0) | (1<<1) = 0011
(1<<0) | (1<<2) = 0101
(1<<1) | (1<<2) = 0110
(1<<0) | (1<<1) | (1<<2) = 0111

아...모두 다른 값이 나오네요.
즉 or(|) 연산을 통해 각각의 속성을 모두 표현할 수 있다는 말이죠.

이것이 상수에 어떤 값을 할당하는지를 결정하는 이유였네요...^^

블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요

최초 작성일 : 2010/04/11 10:34 


alloc (new)

생성할 객체를 로드하기 위한 메모리 영역을 확보하고 retain count를 1로 만든 후 객체를 반환한다.

생성된 객체에 대해 소유(사용)자가 된다.


copy

객체를 복제하여 retain count를 1로 만든 후 객체를 반환한다.
값의 복사는 아니며, copy를 한 경우에는 복제된 객체에만 소유(사용)자가 된다.


retain

기존에 다른 곳에서 참조되고 있는 객체에 대해 retain count를 1 증가시키면서

객체에 대한 소유(사용)권을 얻어온다.


***

소유권에 대한 문제 :

위 내용에 보면 '소유권'에 대한 언급이 있는데 이 소유권이란 어떤 객체의 소유자가

그 객체의 인스턴스에 대해 메모리 해제의 책임을 진다는 의미로 일종의 개발 관행이다.

alloc(new), copy, retain 등으로 객체의 인스턴스를 생성하거나 참조 카운트를

올리는 것이 바로 그렇게 생성된 인스턴스의 소유자가 되는 것이다.

'Development > Tips' 카테고리의 다른 글

[옛 글] [linux] watch 명령어  (0) 2013.07.16
[옛 글] [Tip] enum 선언  (0) 2013.07.15
[옛 글] [Tip] alloc(new), copy, retain  (0) 2013.07.15
[옛 글] [Tip] UITableView  (0) 2013.07.08
[옛 글] [DBMS]repository create error 처리  (0) 2013.07.05
[옛 글] [SQL] Merge문 예제  (0) 2013.07.05
블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요