20110628 :: iOS5 SDK의 새로운 기능들

iOS5는 알림센터와 같은 새로운 사용자 환경이 추가되었지만, 새로운 형태의 앱을 더욱 쉽게 개발할 수 있도록 하는 새로운 기능들이 추가되었다.

iCloud Storage APIs

 

  • 클라우드 저장소인 iCloud를 통해 사용자의 파일을 저장하거나 (iCloud document storage) 사용자의 정보를 애플케이션간에 공유하는 (iCloud key-value data storage) 방법이 생겼다. iOS 및 OSX는 싱크 데몬을 제공하며 이를 통해 앱은 iCloud 환경에 있는 문서를 손쉽게 액세스할 수 있도록 한다.싱크 시 버전 충돌을 해결하기 위한 방법도 제공하고 있다.
  • 키-밸류 데이터를 iCloud에 저장하여 다른 디바이스나 다른 맥에서 동작하는 어플리케이션에게 데이터를 전달할 수 있다. 키-밸류 쌍의 최대 크기는 64KB이며 단일 키의 최대 크기는 4KB를 초과할 수 없다. 이는 NSUbiquitousKeyValueStore 클래스에 의해 제공된다.

 

iCloud Backup

 

iOS5는 iCloud를 통한 자동 백업을 사용할 수 있다. 샌드박스내의 도큐먼트 폴더내의 자료는 자동으로 백업된다.

 

자동 참조수

Objective-C 컴파일러에의해 객체의 참조수는 자동으로 관리된다. 따라서 retain, release, autorelease, dealloc 의 기능은 사용해서는 안된다. 또한 커스텀 retain, release 기능을 구현할 수 없다.

 

  • C구조체 내에 객체의 포인터를 저장하지 말 것
  • 객체와 객체가 아닌 자료형사이에 강제 캐스팅을 하지 말 것
  • NSAutoreleasePool 객체를 사용하지 말 것. 대신에 @autoreleasepool 키워드를 사용하여 오토릴리즈 블럭을 사용할 수는 있다.

Objective-C 컴파일러는 개발자에게 객체 그래프를 생각하고 사용하기를 권장한다. 즉 객체간의 관계를 생각해야지 리테인/릴리즈에 대해서 생각하지 않는 것이다. 이 점에서 ARC는 약한참조제거라는 개념을 포함한다. 즉 약한참조제거의 값은 객체가 해제된 지점을 가리키고 있을 때 nil의 값을 갖는다. 변수는 weak, strong 이라는 새로운 선언 속성값을 갖는다.

 

@property (strong) MyClass *myObject;

@property (weak) MyOtherCloass *delegate;

 

(각각, retain, assign에 대응하는 선언 방식이다)

 

 

스토리보드

 

iOS5에서 개발툴의 가장 큰 변화이다. 메인 nib 파일을 대체하는 스토리보드는 프로그램의 모든 화면 UI를 포함하고 어떤 뷰에서 어떤 뷰로 이동할 수 있는지를 지정하고 그 관계를 그래프로 나타내준다. 뷰간의 이동은 performSeaueWiehIdentifier:sender: 를 통해서 발생하며, 이는 화면 아울렛을 통해 지정이 가능하다.

 

기존 iOS4에서는 새로운 뷰로 이동하기 위해서는 해당 클래스의 인스턴스를 만들어 네비게이션 컨트롤러의 제어를 통했으나, 현재는 스토리보드상에서 모든 작업을 할 수 있다. 즉, 정보를 나열하고 보여주는 브로슈어 앱의 경우에는 IB만 사용하여 완전한 구현이 가능하다.

 

새로운 프레임워크

 

GLKit

오픈GL을 쉽게 다룰 수 있도록 하는 GLKit.

 

CoreImage

비디오와 스틸이미지를 변형하는 파워풀한 필터를 제공한다. 이미지를 보정하는 작업을 할 수 있으며, 얼굴 인식등의 기능도 제공한다.

 

트위터

트위터가 프레임워크로 통합되었다.

 

계정 프레임웍

싱글 사인온을 지원하는 프레임웍

 

일반보안서비스(GSS)

파일보안과 관련된 서비스

 

애플리케이션 디자인 레벨의 개선

UIDocument 클래스 지원.

  • 백그라운드에서 데이터를 비동기적으로 읽고/쓰는 것이 가능하며, 읽고 쓰는 동안에도 사용자의 터치에 반응할 수 있다.
  • iCloud 저장소내의 문서에 접근하는 것이 가능하다.
  • 쓰기 캐시를 지원하여 안전한 파일 쓰기를 지원
  • 파일 쓰기 중 버전 충돌에 대한 해결책 지원
  • 특정 시점에 자동 저장 기능
  • 플랫파일/패키지 파일 지원
  • 코어데이터를 사용하는 앱을 위해 UIManagedDocument 서브 클래스가 지원된다.

 

데이터 보호 개선

UIKit 컨트롤의 커스텀 객체

-대부분의 객체 (툴바와 네비게이션 바, 검색바, 슬라이더 등)의 색상과 배경 이미지, 타이틀 위치를 옮길 수 있다.

- 어떤 객체들은 직접 변경하며 어떤 객체들은 외양 프록시를 통해 기본값을 지정할 수 있다.

외양 프록시는 기본값을 변경하도록 해주는 객체이다.

 

컨테이너 뷰 컨트롤러

컨테이너 뷰는 다른 뷰 컨트롤러를 담는 뷰 컨트롤러인데, UINavigationController, UITabBarController, UISplitViewController 를 말한다. 이러한 뷰 컨테이너가 제공하는 컨텐츠들을 조합하여 다른 컨테이너 뷰 컨트롤러를 만드는 것이 가능하다. 컨테이너 뷰는 뷰컨트롤러의 부모로서 동작하며, 각각의 뷰 컨트롤러에 메시지를 보낼 수 있다.

 

페이지 기반 애플리케이션

책자와 같은 형태로 책장을 넘기며 동일한 템플릿 내에 데이터가 바뀌어 표시되는 형태의 앱을 쉽게 만들 수 있게 되었다. UITableView와 마찬가지로 datasource를 이용하여 책의 내용을 구성하는 것이 가능하다.

 

 

20110626 :: iOS5 베타 1일 사용기

여차저차저차해서 애플 개발자 등록을 완료했고, 결국iPod과 iPhone에 iOS5 베타를 설치해보았습니다. 뭐 새로 추가되는 기능을 사용하는 앱을 개발하는 목적은 아니고, 애플 개발자 등록한 김에, 또 새로 나온 기능들도 너무 궁금하고 그래서 설치해 보았습니다. 1

아무래도 베타버전이고 일반 앱이 아닌 OS이기 때문에 좀 꺼려지는 감도 없지 않아서 iPod에만 우선 설치해보았습니다. 개발 장비로 등록을 해야 한다고 해서 아이팟을 등록하고 OS 이미지를 내려 받아 설치했습니다. 인증서를 생성해서 개발자 포탈에 등록하는 과정은 좀 복잡했는데, xcode4에서는 그 이후에 디바이스를 개발용으로 등록하는 과정은 xcode 상에서 “add to portal”만 해주면 되어서 정말 간단했습니다.

실상 이렇게 고생해서 해 놓고나니, 바로 다음날 iOS5 베타 2가 나오는 바람에 또 한 번 갈아 엎는 참사가 있었지만 말입니다.

암튼 그다지 참신한 글은 못될 거 같아서 기능이야기는 좀 생략하고 사용해본 소감을 이야기해 봅니다.

1. 아이팟의 경우에는 베타버전이긴 하지만 상당히 안정적입니다. 체감할 수 있는 성능이 전반적으로 향상된 느낌이 들어요. 공식앱과의 통합이 이루어진 트위터의 경우에도 푸시 알림이 빠릿빠릿하게 잘 들어옵니다.

2. 다만 배터리는 상당히 빨리 닳아버립니다. 이 부분은 아직 최적화가 안되어 있는 부분이긴 합니다만, 4.3.3 버전에 비해서 전원 용량 관리가 거의 ‘안되고 있는 것 아니냐’는 느낌이 들긴 합니다.

3. 기타 성능은 상당히 좋아졌습니다. 다만 신규로 글을 작성하는 액션 시에, 그러니까 키보드가 올라와야 하는 시점에 딜레이가 좀 상당히 발생합니다. 그 외에는 유튜브 영상이 링크된 페이지에서 영상을 클릭하면 아이폰/아이팟은 유튜브 플레이어가 실행되는데, 그 시점에 플레이어 앱이 자꾸 죽는 문제가 있네요.

4. 전체적으로 만족스러운 점은 아이팟에만 국한됩니다. 아이폰에서는 버벅임과 딜레이가 상당히 심각한 수준입니다. 아 물론 베타 1의 경우에는 좀 쓸만했어요. 베타 2는 절대 아이폰 사용자라면 도전해 보지는 마시길.

5. 베타 2로 넘어오면서 아이튠즈와 무선으로 동기화가 가능해집니다. 아이튠즈와 아이팟/아이폰이 같은 네트워크에 있으면 케이블을 연결하지 않아도 아이팟이 아이튠즈에 뜹니다. 아이팟의 설정에서 동기화를 시작하여 바로 동기화 할 수 있어요. 무선으로 아이팟이 백업되고, 음악, 동영상 등의 컨텐츠가 자동으로 전송됩니다. 물론 아이튠즈는 같은 시간에 동시에 다른 기기와도 유/무선 동기화가 가능합니다. 아이튠즈 10.5 베타의 윈도 버전을 설치하는 경우에는 wifi를 통한 동기화 옵션이 표시되지 않습니다. 아마 정식으로 판올림 될 때에는 윈도 버전에도 포함될 기능이겠지만, (어쩌면 포함이 안될지도 모릅니다. 정말로 어쩌면이지만요)

개인적으로 무선 동기화 기능은 정말이지 가장 마음에 듭니다.

6. iCloud가 무료로 본격 제공됩니다. 클라우드 저장 공간은 기본 5GB가 제공되는데, 사실 이 공간에 뭔가 올려서 백업을 하겠다? 턱도 없이 부족할 공간입니다. 아직까지 어떤 자료가 어떤식으로 올라가서 동기화될 수 있는지 그건 시각적으로 확인이 안되니, 테스트를 해보면 파악이 될 듯 하지만 너무 귀찮아요;;;
게다가 iCloud 서비스는 정식 출시시에는 현재와 다른 형상일 수 있다고 하니 이 부분은 조금 추이를 지켜보는 게 좋겠군요. 다른 건 몰라도 사파리의 북마크를 동기화할 수 있고 메모를 동기화할 수 있다는 점은 가장 마음에 듭니다.
음, 그런데 연락처 같은 경우에는 iPhone의 연락처를 어떻게 iCloud로 옮기는지는 아직 그 방법을 모르겠네요;; -_ -;

iOS5의 전반적인 모양새는 상당히 기대해도 좋을 정도라는 건 분명합니다. 그리고 묘하게도 맥(iTunes)에 대한 의존성을 크게 떨어뜨리는 형태로 업그레이드가 진행되지만 더 좋은 맥을 살 필요가 있을 거라는 느낌이 직관적으로 들기도 합니다.

현재 베타2의 성능은 좀 불만스러운 면이 있지만 정식 버전으로 다듬어질 때 즈음엔 상당히 영향력 있는 OS가 될 것으로 예상됩니다. 올 가을을 기대해도 좋을 듯 합니다.

  1. 그렇다고 해서 꼭 베타 OS를 설치하려고 뭐 개발자 등록 신청을 한 건 아니지만요

20110621 :: NSString 사용하기

아주 간단한 앱을 만든다고 해도, 아니 앱이 간단하면 간단할 수록 대부분의 경우 다루는 데이터가 문자열이다. 그런데 C에서는 문자열을 문자의 배열로 사용하기 때문에 어쨌거나 쉽게 사용하기에는 한계가 있는 것이 사실이다. 또한 흔히 쓰이는 다른 언어들에서는 문자열을 하나의 엔티티처럼 취급하도록 하는 많은 장치를 가지고 있다. Objective-C에서도 문자열을 하나의 엔티티처럼 다루기 위해 제공하는 클래스가 있으니 이것이 바로 NSString 이다.

NSString은 사실 NSArray에 기반하는 클래스로 한 번 초기화된 이후에는 다시 초기화하는 것은 가능하나, 자르거나 덧붙이거나 변경하는 작업은 불가능하다. 이러한 작업은 NSMutableString이라는 다른 클래스를 사용해서 수행할 수 있다. 하지만 문자열의 경우에는 원본을 조작하기 보다는 조작된 결과로 다른 복사본을 만드는 것이 더 많이 사용되는 방법이기에 특별한 경우를 제외하고는 프로그래머가 NSString만 써도 큰 문제는 없을 것으로 보인다.

주로 사용되는 메서드들

문자열 만들기

 

stringWithFormat:

템플릿을 사용하여 문자열을 생성한다.

+(id)stringWithFormat:(NSString *)format, stringParameter1,….

format : NSString으로 문자열 템플릿을 지정한다.

stringParameters : 템플릿에 삽입될 각각의 값.

NSString *myString = [NSString stringWithFormat:@"%s : %d", (const char *)"Number four", 4];

initWithFormat:

템플릿을 사용하여 NSString 을 생성한다.

NSString *myString = [[NSString alloc] initWithFormat:@”%s : %d”,(const char *)”Number four”, 4];

 

문자열의 일부를 추출하기

 

componentsSeperatedByString:

구분자를 사용하여 해당 객체를 쪼갠 다음 배열로 반환한다.

-(NSArray *)componentsSeparatedByString:(NSString *)separator

NSString *list = @”Norman, Stanley, Flethcer”;

NSArray *listItems = [list componentsSeparatedByString:@", "];

==> {@”Norman”, @”Stanley”, @”Fletcher” }

만약 문자열이 separator와 동일하게 시작한다면 (@”, Norman….”) 결과값은 {@”", @”Norman” ..} 과 같이 된다. 만약 문자열에 구분자가 포함되어 있지 않다면 문자열 자체를 원소로 갖는 배열을 반환한다.

-substringFromIndex:

주어진 인덱스에서 끝까지를 잘라낸 문자열을 반환한다.

-(NSString *)substringFromIndex:(NSUInteger)anIndex

-substringWithRange:

문자열의 특정 구간을 잘라낸다.

-(NSString *)substringWithRange:(NSRange)aRange

NSRange aRange = NSMakeRange(2,4);

NSString *myString = @”abcdefg”;

NSLog(@”%@”,[myString substringWithRange:aRange];

==> cd

-substringToIndex:

문자열의 처음에서 주어진 인덱스까지를 반환한다. 인덱스에 해당하는 글자는 포함하지 않는다.

-(NSString *)substringToIndex:(NSUInteger)anIndex

-characterAtIndex:

문자열의 인덱스에 위치하는 문자열을 반환한다.

-(unichar)characterAtIndex:(NSUInteger)index

 

문자열의 길이 구하기

 

length:

-(NSUInteger)length

문자열의 길이를 정수형으로 반환한다.

 

 

 

문자열 변경하기

 

-capitalizedString

첫 글자를 대문자로, 나머지는 모두 소문자로 변경한 문자열을 반환한다.

-(NSString *)capitalizedString

-lowercaseString

모든 글자를 소문자로 변환한 문자열을 반환한다.

-(NSString *)lowercaseString

-uppercaseString

모든 글자를 대문자로 변환한 문자열을 반환한다.

-(NSString *)uppercaseString

다른 포맷의 문자열

-cStringUsingEncoding:

주어진 인코딩으로 인코딩된 C 문자열을 반환한다.

-(const char *)cStringUsingEncoding:(NSStringEncoding)encoding

-UTF8String

UTF8로 인코딩된 유니코드 문자열을 반환한다.

-(const char *)UTF8String

 

글자 혹은 문자열을 찾기

 

-rangeOfString:

주어진 문자열을 객체내에서 찾아 그 위치를 반환한다.

-(NSRange)rangeOfString:(NSString *)aString

1)만약 aString이 nil 이면 NSInvalidArgumentExceptions 이 발생한다.

2)주어진 문자열이 없다면 {NSNotFound, 0}이 반환된다.

-rangeOfString:options:

-(NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions) mask

옵션에는 다음과 같은 것 들이 있다

NSCaseInsensitiveSearch

NSLiteralSearch

NSBackwordsSearch

NSAnchoredSearch

-rangeOfString:options:range:

주어진 범위값 내에서만 찾는다.

 

 

대체하기

 

-stringByReplacingCharactersInRange:withString:

지정한 범위의 글자를 주어진 문자열로 대체

-(NSString *)stringByReplacingCharactersInRange(NSRange)range withString:(NSString *)replacement

-stringByReplacingOccurrenceOfString:withString:

주어진 문자열을 다른 문자열로 대체

-(NSStirng *)stringByReplacingOccurrenceOfString:(NSString *)target withString:(NSString *)replacement

문자열 내에 등장하는 모든 target과 동일한 문자열이 replacement로 대체된 문자열을 반환함

-stringByReplacingOccurrenceOfString:withString:options:range:

옵션과 범위를 추가.

 

비교하기

-compare:

문자열과 비교함. 반환값은 NSComparisionResult 값.

만약에 사용자가 입력한 문자열과 비교하려한다면 localizedCompare:나 localizedCaseInsensitiveCompare:를 사용해야 한다.

-localizedCompare:

주어진 문자열과의 비교를 수행한다.

-(NSComparisonResult)localizedCompare:(NSString *)aString

결과값

NSOrderedAscending : 주어진 문자열보다 선행할 때
NSOrderedSame : 주어진 문자열과 같을 때
NSOrderedDescending :주어진 문자열보다 뒤에 위치할 때

-localizedCaseInsensitiveCompare:

주어진 문자열과 비교를 수행하되, 대소문자를 가리지 않는다.

 

숫자값 구하기

다음 메서드들은 문자열내에 숫자가 있을 때 그 숫자를 숫자값으로 반환한다. 만약, 숫자가 없는 문자열인 경우에는 0을 반환한다.

-doubleValue

-floatValue

-intValue

-integerValue

-longLongValue

-boolValue

 

 

URL로 작업하기

-stringByAdddingPercentEscapesUsingEncoding:

-stringByReplacingPercentEscapesUsingEncoding:

20110621 :: Objective-C의 문자열 포맷팅

Formatting Specifier

전체 내용을 정리한 것은 아니지만 참고 삼아.

 

  • %@ : 종류에 무관하게 Objective-C 객체를 의미한다. 대부분 descriptionWithLocale이나 description 이 출력된다. NSString을 포맷팅할 때 사용한다.
  • %% : “%” 문자
  • %d, %D, %i : singed-32bit 정수
  • %u, %U : Unsigend-32bit 정수
  • %hi : signed-16bit 정수
  • %ui : unsigned-16bit 정수
  • %qi : signed-64bit 정수
  • %qu : unsigned-64bit 정수
  • %x : signed-32bit 정수를 16진수로 표기함
  • %X : unsigned-32bit 정수를 16진수로 표기함
  • %qx : signed-64bit 정수를 16진수로 표기함
  • %qX : unsigned-64bit 정수를 16진수로 표기함
  • %o, %O : unsigned-32bit 정수를 8진수로 표기함
  • %f : 64비트 소수 (double)
  • %e : 64비트 소수를 부동소수점 형태로 표기함 ex. 3.242343e25
  • %E : 64q비트 소수를 부동소수점 형태로 표기하는데, 대문자 E를 사용함 ex. 8.34234354E5
  • %c : 8비트 unsigned char 문자. 아스키코드일 때는 아스키문자가 표시되고 그외에는 숫자값으로 표시된다.
  • %C : 16비트 유니코드 문자. 아스키코드일때는 아스키문자로 표시되고 그 외에는 u가 앞에 붙는 숫자값으로 표시된다.
  • %s : 널문자로 종료되는 8비트 문자열
  • %S : 널문자로 종료되는 16비트 유니코드 문자열
  • %p : 0x9a와 같이 16진수로 표기되는 void 포인터

20110621 :: SQLite3에서 대소문자 구분 없이 비교하기

사실, SQL 표준 구문이겠지만 왜 그간 이 이슈를 한 번도 제대로 생각하지  않았는지는 의문이다. 혹은 아예 테이블/칼럼의 속성 자체에 대소문자를 구분하지 않도록 정의하는 것이 있는지도 모르겠다.

SELECT * FROM MyTable WHERE t_Name = ‘Alice’ COLLATE NOCASE;

말미에 붙인 COLLATE NOCASE는 문자열을 비교할 때,  대소문자에 대해 구분을 하지 않는다.

일단 나머지는 다음에 정리하기로하고, 나중에 찾기 쉽에 이것만 메모.