Arm6 vs Arm7 « cocos2d for iPhone

Xcode 빌드 세팅을 보면 arm6와 arm7을 선택하는 곳이 있습니다. 아래 링크는 이 선택이 무엇을 위한 것인지에 대해 간단한 힌트를 얻을 수 있는 게시물입니다.

Arm6 vs Arm7 « cocos2d for iPhone.

Read More

UITabBar의 달라진 동작

UITabBar의 iOS 3.1 이하에서의 동작과 4.x에서의 동작이 다릅니다. 3.1 이하에서는 UITabBarDelegate의 [tabBar:didSelectItem:]을 호출하면 didSelectItem의 인자로 지정된 item으로 활성 탭이 변경되었습니다. 그런데, 4.x에서는 이 함수를 호출해도 UITabBar의 활성 탭이 변경되지 않습니다. 활성 탭을 변경하려면 직접 UITabBar의 selectedItem을 지정해야 합니다.

iOS 4.x가 되면서 좀더 SDK를 충실하게 구현했다는 느낌을 갖게 됩니다. iOS 3.1 이하에서는 문제가 없던 부분에 문제가 발생해서 자세히 원인을 들여다 보면, SDK의 구현 방식이 바뀐 것을 알 수 있었습니다. 몇가지 예를 들어 보겠습니다. 탭바에 badge number를 설정하는 등, UI 컴포넌트를 변경하는 경우, 기존에는 문제가 없이 예상하던 대로 동작하던 것이, 이제는 Main thread에서 UI 컴포넌트를 변경하지 않으면 3.1이하에서와 다르게 동작합니다. UIAlertView도 마찬가지일 것입니다. 백그라운드 작업이 완료된 결과를 UIAlertView로 사용자에게 표시할 때 Main thread를 사용하지 않으면, UIAlertView가 사용자의 입력을 받지 못할 수 있습니다.

iOS 4.x가 되면서 에러의 검출과 보고도 더 좋아진 것 같습니다. 문제의 원인을 파악하기가 더 좋아졌습니다. 예를 들어 뷰간 transition을 하는 경우 새로운 뷰가 올라 오면서 기존 뷰가 감춰지는데, 이 과정이 짧은 시간에 계속 반복되는 시험을 하면 기존 뷰가 메모리에서 사라지는 경우가 있었습니다. iOS 3.1 이하에서는 아무리 테스트를 해도 원인을 알 수 없던 것이 iOS 4.0에서 테스트를 해보니 바로 NSException이 발생했습니다.

Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘Attempting to begin a modal transition from to while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed’

Read More

커스텀 URL

애플리케이션마다 커스텀 URL을 등록할 수 있습니다. 애플리케이션이 등록한 커스텀 URL을 이용하면 그 애플리케이션을 실행시킬 수도 있습니다.

현재 등록되어 있는 커스텀 URL을 찾아보기 위한 가장 좋은 방법은 handleOpenURL 홈페이지를 이용하는 것입니다.

Read More

iOS 3.2 이상과 이하에서 동영상 재생하기

iOS 3.2 이상과 3.1 이하 버전에서 동시에 동영상 재생을 지원하는 작업은 어렵지 않습니다. 두가지 경우에 대해 표준 방법이 있고, 그 방법을 잘 따르면 재생은 어렵지 않습니다.

자세한 방법은 다음에 시간을 내서 정리해보겠습니다.

Read More

UIAlertView에서 사용자의 결정에 따른 작업 처리 시 주의할 점

UIAlertView는 사용자에게 선택을 하게 하고, 그 결과를 받는 용도로 사용될 수 있다. 이 때 사용자의 선택에 따라 작업을 하는 경우에 주의할 점이 있다. 처리 시간이 오래 걸리는 작업을 UIAlertView의 Delegate 메소드인 “- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;”에서 처리하는 경우 UIAlertView가 화면에서 사라지기 전에 다시 사용자의 입력을 받을 수 있다. 이렇게 되면 동일한 작업을 중복해서 시작하는 상황이 될 수 있어 문제를 일으킬 수 있다.

권하는 방법은 [alertView release]로 UIAlertView가 먼저 사라지고, 사용자의 버튼 선택에 따른 작업을 잠시 후에 실행하도록 performSelector:withObject:afterDelay를 사용하는 것이다. 이 메소드는 짧은 시간 후 지정된 메소드가 동일한 스레드 내에서 실행되도록 해준다.

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;
{
    [alertView release];

    if (buttonIndex == 1) {
        if (bCheckStatus == YES) {
            [self performSelector:@selector(delayedStopTask:) withObject:nil afterDelay:0.3f];
        }
        else {
            [self performSelector:@selector(delayedStartTask:) withObject:nil afterDelay:0.3f];
        }
    }
}
Read More