콘텐츠로 건너뛰기
Home » Development » Objective-C » Page 8

Objective-C

[Cocoa] Cocoa의 MVC

모델-뷰-컨트롤러 디자인 패턴

모델-뷰-컨트롤러(MVC) 디자인 패턴은 꽤 오래된 패턴이다. 다양한 형태의 MVC는 스몰토크의 초창기부터 존재해왔다. MVC는 앱의 전체적인 아키텍처는 물론 앱 내부에서의 객체의 일반적인 역할에 따라 이들을 분류한다. MVC를 구현하는데는 다른 디자인패턴들이 조합되어 사용될 수도 있다.

더 보기 »[Cocoa] Cocoa의 MVC

[CoreGraphics] CGBitmapContextCreate의 CGBitmapInfo 값

CGBitmapContextCreate함수를 사용하여 그래픽 컨텍스트 객체를 만들 때, 사용하는 마지막 파라미터에 대한 의문

함수 원형은 일단 다음과 같다.

CGContextRef CGBitmapContextCreate (
    void *data,     // 통상 NULL을 쓴다.
    size_t width,       // 이미지의 가로 크기
    size_t height,      // 이미지의 세로 크기
    size_t bitsPerComponent,    // 컴포넌트(채널)별 비트 수, 통상 8을 쓴다. (RGBA로 32비트 색상을 쓰니까)
    size_t bytesPerRow, // 한줄에 들어가는 바이트 수. 이는 width * 4가 된다. (32비트가 4바이트니까)
    CGColorSpaceRef colorspace, // 컬러스페이스 객체
    CGBitmapInfo bitmapInfo // 문제의 마지막 파라미터
);

이와 같이 정의되어 있는데, 실제 예제들을 보면 (애플 개발자 문서에서도!) kCGImageAlphaPremultipliedLast 와 같은 값을 넘기는데, 이는 CGBitmapInfo가 아니라 CGImageAlphaInfo에 정의된 상수값이다!! 더 보기 »[CoreGraphics] CGBitmapContextCreate의 CGBitmapInfo 값

[C/Objective-C] 블럭

Block

Block은 어디다 쓰나

블럭은 작업의 단위(= 코드 조각)을 캡슐화한 객체이고, 언제든 실행할 수 있다. 이는 포터블한 익명의 함수와 같아서 함수나 메소드의 인자로 넘겨지거나 반환될 수 있다. 또한 그 자체로 인자를 받을 수 있고 리턴 타입을 가질 수 있다. 블럭은 변수에 할당한 다음, 일반적인 함수 호출과 같은 방식으로 실행할 수 있다.

더 보기 »[C/Objective-C] 블럭

[Objective-C] Objective-C의 메모리 관리 방법

Objective-C의 메모리 관리

메모리를 할당하고 해제하지 않는다면 프로그램이 이런 작업을 반복하면 할 수록 계속해서 새로운 메모리를 사용하게 되고, 종국에 가서는 더 이상 쓸 수 있는 메모리가 남아나지 않는 상황이 벌어질 수 있다. 그리고 최근의 OS들의 그 복잡한 구조 때문에 이렇게 잘못 만들어진 프로그램이 아닌 다른 프로그램이 크래쉬될 수 있는 위험도 있다. C 계열 언어에서의 메모리 관리란 매우 중요하면서도 프로그래머의 골치를 썩히는 문제이다.더 보기 »[Objective-C] Objective-C의 메모리 관리 방법

Deep Copy

copy나 mutableCopy를 사용하면 객체의 사본을 만들 수 있다. 이는 같은 데이터를 가리키지 않고 별도의 할당된 메모리에 데이터를 복사하여 또 하나의 할당된 객체를 만들어주는 메소드이다. 통상 NSCopying 프로토콜을 따르면 복사가 가능하고, 그 중 변경이 가능한 mutable한 객체들은 mutableCopy를 제공한다. 문제는 어떤 객체가 다른 객체를 가리키고 있는 경우에는 포인터만 복사된다는 것이다. 예를 들어서 NSArray나 NSDictionary의 경우, 배열이나 사전 객체를 복사하면 하나의 사전, 배열이 추가로 생성되는 것은 맞다. 하지만 배열의 모든 원소는 원본 배열의 원소와 같은 포인터가 복사되는 것으로, 배열 그 자체는 사본이지만,… 더 보기 »Deep Copy

[Obj-C] NSObject 없이 새로운 객체를 만들기

Objective-C는 C의 수퍼셋(상위집합)이다. 따라서 Objective-C의 ‘이상하게 보이는 문법’을 제외하면 온전히 C코드만으로도 프로그램을 작성하는 것은 가능하며, 컴파일도 된다. 물론 이게 C 프로그램하고 다르냐면 그건 또 아니라고 하겠다만.

어쨌거나 현재 Objective-C가 널리 사용되고 있는 플랫폼은 애플의 OSX와 iOS 밖에 없다고 해도 과언은 아니다. 이 말은 곳 Cocoa(코코아는 Foundation과 Webkit 프레임워크의 합집합이다)가 곧 Objective-C의 기본 라이브러리와 거의 같다는 말이다. 특히 Foundation이 그렇다. Foundation에는 그 유명한 NSObject가 정의되어 있고, 실질적으로 프로그래머가 만들거나 혹은 이용하는 모든 클래스는 NSObject로부터 상속받은 객체들이다. (여기에는 예외가 하나 있는데, NSProxy 클래스는 NSObject로부터 상속받지 않는다.) 결국 NSObject 없는 Objective-C는 있을 수 없는 것인가?더 보기 »[Obj-C] NSObject 없이 새로운 객체를 만들기

[Cocoa / Objective-C] NSString의 문자열 뒤집기, 글자를 정렬한 문자열 구하기.

프레임워크에 당연히 있는 기능일 줄 알았는데 없더라… 그래서 자작. 짤막한 설명 문자열 뒤집기는 C문자열로 바꾼다음 포인터를 쓰는게 제일 깔끔할 것 같아서 그렇게 했다. -UTF8String 메소드는 const char 타입 포인터를 리턴하는데, 이걸 char 형으로 강제캐스팅하는 게 찜찜해서 strcpy로 복사했는데, 어디서 이 함수도 상당히 나쁘다고 쓰지 말라더라. (다른 뭐를 쓰라던데 그게 기억이 안나서 그냥 씀) malloc으로 할당한 메모리는 ARC의 관심밖이므로 철저히 free 해주는 나란 남자, 그런 남자… 문자열내 문자들을 사전순으로 정렬해주는 건 소인수 분해 따위나 할 때 쓸모가 있긴 있을텐데,  NSArray의 sortedUsingComparator:… 더 보기 »[Cocoa / Objective-C] NSString의 문자열 뒤집기, 글자를 정렬한 문자열 구하기.

[Objective-C] 카테고리

카테고리는 쉽고도 정말 강력한 Objective-C의 기능 중 하나이다. 카테고리는 기존에 정의된 어떤 클래스를 쉽게 확장할 수 있도록 한다. 만약 A라는 클래스에 부족한 기능이 있어 이를 추가하고자 할 때는 해당 클래스를 상속 받는 클래스 B를 만들 수 있고, 이를 사용하면 된다.1 하지만 이 새롭게 추가된 기능을 사용하기 위해서는 이전에 작성한 코드에서 클래스 A를 사용하는 부분을 모두 클래스 B에 맞도록 수정해야 한다.더 보기 »[Objective-C] 카테고리

Objective-C 리터럴 문법 살펴보기

이 글은 다음 문서를 참고하였음 http://clang.llvm.org/docs/ObjectiveCLiterals.html 애플이 밀고 있는 LLVM 컴파일러 4.0에서부터 Objective-C Literal 이라는 새로운 기능을 사용할 수 있게 되었다. 새롭게 추가된 리터럴은 크게 세 가지로, NSNumber Literals, Colloection Literals, Object Subscripting 이다. 각각을 좀 살펴보자. NSNumber Literals Foundation 프레임웍의 NSNumber 클래스는 스칼라값을 감싸는 객체이다. 객체에 들어갈 수 있는 값은 C에서는 ‘수’로 취급할 수 있던 char, short, int, long, long long 등의 정수들과 Float, double과 같은 실수들 그리고 BOOL, bool 값등이다. 이렇게 숫자값을 객체에 감싼 것을 Boxed values라고도 한다더라.… 더 보기 »Objective-C 리터럴 문법 살펴보기

[Cocoa] NSValueTransformer

Value Transformer

코코아 바인딩에서 어떤 키패스의 값을 그대로 사용하는 것이 아니라 다른 단위로 변환하는 등의 변화를 주고 사용해야 한다면 중간에 어떤 매개체가 값을 바꿔서 전달해주는 역할을 하도록 해야 한다. 예를 들어 섭씨 온도를 표시하는 텍스트 필드와 화씨 온도로 조절하는 슬라이드가 있고 이 들을 코코아 바인딩으로 구현하고자 한다면, (물론 모델 객체의 두개의 프로퍼티를 각각 만들고 여기에 바인딩해도 되지만) NSValueTransformer를 사용하여 값 변환 장치를 만들어 사용할 수 있다.

사용하는 일이 흔하지는 않지만, 파운데이션 프레임워크는 이런 값 변환기를 몇 개 가지고 있으며 개발자는 NSValueTransformer를 서브클래싱하여 이런 변환기를 만들 수 있다.

더 보기 »[Cocoa] NSValueTransformer