최초 작성일 : 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

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2011/02/24 03:26 


Day Recorder 검색 기능 추가 후 테스트 중에

계속해서 테이블 뷰를 스크롤하면 앱이 다운되는 증상이 발견됨

원인은 property로 설정한 전역변수 앞에 self를 붙이지 않았기 때문이었음

따라서 property로 설정한 전역변수 앞에는 반드시 self를 붙이는 습관을
갖도록 해야겠음.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 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
블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2010/04/10 16:24 



Objective-c에서의 메서드는 크게 클래스 메서드와 인스턴스 메서드로 나눌 수 있다.


1. Class Method

클래스 메서드는 클래스 인스턴스가 아닌 클래스에서 바로 사용 할 수 있는 메서드로
선언시에 + 기호로 시작을 한다. java 언어의 static 메서드와 유사하다.

예)

+ (void) classMethod;

클래스에서 바로 사용을 할 수 이있기 때문에 함수를 호출하는 경우에도 인스턴스명을
사용하지 않고 클래스명을 사용한다.

예)
MyClass *myClass;
...
[MyClass classMethod];

만일 자기 자신의 인스턴스를 생성하는 클래스 메서드를 subclass에서 호출한 경우
리턴되는 인스턴스는 subclass의 인스턴스이다.

예)
MyClass *myClass = [MyClass classMethod];
MySubClass *mySubClass = [MySubClass classMethod]; //MyClass의 subclass

클래스 메서드는 인스턴스 변수에 직접 접근하여 참조할 수 없다.

@interface MyClass : NSObject {
    NSString *title;
}
+ (void)classMethod;
@end

이 경우 classMethod는 title 변수를 직접 참조할 수 없다.

클래스 메서드 내에서 self를 사용하는 경우 self는 클래스 메서드가 선언된
바로 그 클래스를 의미한다.

만일 MyClass라는 클래스에 구현된 클래스 메서드 myMethod가 아래와 같다면

+ (id)myClass {
    return [[[self alloc] init] autorelease];
}

이 메서드 내에서의 self는 MyClass 클래스이다.

만일  MyClass의 서브 클래스인 MySubClass의 인스턴스를 얻고자 한다면
아래와 같이 호출해야 한다.

[MySubClass myClass];

2. instance Method

인스턴스 메서드는 - 기호로 메서드를 선언한다.

인스턴스 메서드는 클래스의 인스턴스가 생성된 후 사용할 수 있는 메서드로
클래스의 인스턴스와 생명주기를 같이 하여 인스턴스가 메모리에서 해제되면
더이상 사용을 할 수없는 메서드이다.

메서드 호출 역시 클래스 이름이 아닌 인스턴스 이름을 통하여 하게 된다.

만일 MyClass 클래스에 다음과 같이 인스턴스 메서드가 선언되어있다면

- (void) myInstanceMethod;

이 메서드는 다음과 같은 절차를 거쳐 호출될 수 있다.

MyClass *myClass = [MyClass myClass];
[myClass myInstanceMethod];

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^