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

Objective-C

What Happened to NSMethodSignature?

NSInvocation에 대해 찾아보다가 Swift 공식 블로그에서 찾은 글을 간단히 번역해본다.

https://developer.apple.com/swift/blog/?id=19

What Happened to NSMethodSignature?

코코아 프레임워크를 Swift로 옮기는 것은 우리 스스로가 우리의 API를 새로운 관점에서 볼 수 있는 좋은 기회가 되었습니다. 우리는 Swift의 목표에 맞지 않는다고 생각되는 클래스들을 찾았고, 우리의 우선순위는 주로 안전성에 맞췄습니다. 예를 들어 동적인 메소드 호출(dynamic method invocateion)과 관련된 클래스들은 Swift에 반입되지 않습니다. 이러한 클래스에는 NSInvocationNSMethodSignature가 있지요.
우리는 최근에 이 클래스들이 빠져있음을 발견한 한 개발자로부터 버그 리포팅을 받았습니다. 이 개발자는 Objctive-C에서 메소드 인자들의 타입을 검사하는데 NSMethodSignature를 사용하고 있었고, Swift로 마이그레이션하는 과정에서 이 클래스를 사용할 수 없다는 것을 알았습니다. 실제 그 코드는 인자 타입이 정해지지 않은 HTTP 핸들러릘 받도록 되어 있었습니다. 예를 들면 이런 것들이죠.더 보기 »What Happened to NSMethodSignature?

코코아 바인딩이란

코코아 바인딩

기능적인 측면에서 가장 단순하게 설명하면, 코코아 바인딩은 모델과 뷰 사이에 어떠한 글루코드 없이 값과 디스플레이되는 것을 동기화시키는 것이다. 즉 바인딩을 구성하면 코드상에서 어떤 프로퍼티의 값이 변경될 때 별도의 업데이트 코드를 작성하지 않더라도 자동으로 뷰가 업데이트되고, 반대로 뷰에서 사용자가 값을 조작하는 이벤트가 발생하면 역시 아무런 코드가 없더라도 연결된 프로퍼티 값이 변경되게 하는 것이다.

코코아 바인딩은 코코아의 기본 기술들을 결합하여 구현되는데, 작성/유지해야 하는 코드의 양을 최소화하면서 뷰와 모델간의 바인딩을 거의 공짜로 제공한다. 클래스를 작성할 때, 키밸류 컨벤션만 따랐다면, 코코아 바인딩을 적용하기 위해서 기존 코드를 재작성할 필요도 없다.

더 보기 »코코아 바인딩이란

Objective-C :: 임의의 데이터 타입을 NSData로 인코딩하기

NSValue NSData 변환

NSValueNSData로 변환하는 방법에 대해 생각해보자. 코어데이터 등에서 표준으로 지원하는 타입이 아닌 경우, NSData를 이용해서 이진데이터로 저장하는 방법이 있는데, 예를 들어서 NSRange(이건 C구조체이다.)를 이진데이터로 바꾸는 것은 다음과 같이 하면 된다.

NSRange r = NSMakeRange(0, 10);
NSValue* v = [NSValue valueWithRange:r];
NSData* d1 = [NSKeyedArchiver archivedDataWithRootObject:v];

구조체나 스칼라값 타입은 NSValue로 감싼 다음 이진데이터로 직렬화할 수 있다. NSValue 역시 NSCoding 프로토콜을 따르므로 위와 같이 처리하면 되는데….더 보기 »Objective-C :: 임의의 데이터 타입을 NSData로 인코딩하기

블럭의 변수 캡쳐링

블럭 내 변수 캡쳐링

C의 코드블럭은 사실상 여타 프로그래밍 언어의 클로저개념1과 거의 동일하다.
블럭 내부에서는 다음의 변수들을 사용할 수 있다.

  1. 전역변수와 정적변수는 블럭내에서 액세스 가능하다.
  2. 블럭 내로 전달된 파라미터는 블럭 내부로 복사되며 지역변수처럼 액세스한다.
  3. 블럭을 감싼 영역의 스택 변수는 블럭 내에서 액세스 가능하되 상수로 취급한다.
  4. 블럭을 감싼 영역에서 __block 변경자와 함께 선언된 변수는 참조로 전달되며, 블럭내에서 변경 가능하다.
  5. 블럭 내에서 선언된 지역 변수는 함수의 지역변수와 동일하게 동작한다. 액세스 가능하며, 블럭의 스코프가 끝날 때 파괴된다.

더 보기 »블럭의 변수 캡쳐링

Objective-C에서 웹서버로 POST 요청

코코아 네트워킹

코코아에서 네트워크 연결을 통해 통신을 하는 기능을 추가하는 것은 사실 쉽지 않다. 그것은 여느 C/C++ 프로그램과 마찬가지로 상당히 번거로운 작업들을 수반한다. 하지만 이러한 과정들은 단지 작성해야 할 코드량이 파이썬과 같은 언어에 비해 많다는 것이지, 그 과정까지 번거롭다는 것은 아니다. 보통 HTTP 연결을 사용하는 프로그램은 다음과 같은 과정을 거쳐서 동작한다. 더 보기 »Objective-C에서 웹서버로 POST 요청

사전의 fast enumeration

NSDictionary 객체도 사전처럼 fast-enumeration을 적용할 수 있다. 이 때 순회의 대상은 각각의 키가 된다. for (NSString *key in myDictionary) { NSLog(@"%@: %@", key, [myDictionary valueForKey:key]); }

파일에서 한줄씩 읽어 들이기 – Objective-C

파이썬에서는 텍스트 파일을 가리키는 파일 객체는 파일 내용의 각 라인에 대한 이터레이터처럼 작동한다. 따라서 별다른 노력을 들이지 않고 for … in 구문을 통해서 텍스트 파일의 각 라인을 읽어서 처리하는 것이 가능하다. 이 기능의 멋진 점은 파일 객체가 느긋하게 동작하기 때문에 각 라인이 필요한 시점에 한 라인씩 읽어들인다는 것인데, 따라서 각 라인의 길이가 적절하다면 파일의 크기가 아무리 크더라도 안전하게 읽어들일 수 있다는 것이다. Objective-C에서 텍스트 파일은 보통 NSString의 stringWithContentOfFile: 메소드를 사용한다. 이 메소드의 문제는 파일을 한 번에 읽어들인 다는 점이다. 따라서… 더 보기 »파일에서 한줄씩 읽어 들이기 – Objective-C

[iOS앱 만들기 006] 뷰 전환하기

이 포스팅과 관련하여 스토리보드에서 Segue를 사용하여 화면을 전환하는 사이에 두 뷰 컨트롤러 간의 데이터를 교환하는 방법에 대한 예시를 최근에 추가로 포스팅하였으니, 참고해주세요.  – Segue를 통한 뷰 컨트롤러 전환과 데이터 교환 방법 가장 단순한 iOS의 앱을 하나 구성한다고 하면 이 앱은 앱 델리게이트과 기본 뷰(root view)의 뷰 컨트롤러, 즉 루트 뷰 컨트롤러로 구성이 될 수 있다. 물론 클래스를 디자인하기에 따라서는 앱 델리게이트와 뷰 컨트롤러가 하나의 객체일 수도 있다. (앱 델리게이트가 UIViewController의 서브클래스이면서 애플리케이션 프로토콜을 따르면서 이 두가지 일을 모두 수행하도록 만들면… 더 보기 »[iOS앱 만들기 006] 뷰 전환하기

iOS에서 SQLite3 사용하는 방법 (Objective-C)

Swift3 버전에 대한 SQLite3 사용법은 이 포스트를 참고하시라.

예전에 쓴 글이 있기는 하지만, 그냥 요리법처럼 쓴 글이기도 하거니와 소스코드에서 뭔가 글자가 빠지는 등(syntax highlighter를 안써야 겠지만 기존 글 고치기가 귀찮아…) 문제가 많아 내용을 보충해서 다시 작성.
애플은 SQLite3를 직접 인터페이스하는 것보다는 코어데이터를 사용하라고 권장하고 있고, (실제로 있다가 빠진 것인지는 알 수 없으나 그런 주장을 하는 사람들이 종종 있다) 애플 개발자 문서에서도 관련 내용을 내렸다고 한다. (하지만 이는 사실이 아닐 거라 생각한다. 왜냐면 iOS에서 SQLite3를 인터페이스 하는 부분은 전적으로 libsqlite3를 사용하는 것이고, 이에 대한 문서는 SQLite3 홈페이지에 가면 있기 때문이다) 더 보기 »iOS에서 SQLite3 사용하는 방법 (Objective-C)