Tag Archives: Objective C

[iOS] GCD를 이용한 싱글턴 클래스 구현

GCD(Grand Central Dispatch)을 이용하여 Singleton 패턴을 구현하는 방법을 정리해 봅니다. GCD에서 제공하는 dispatch_once는 단한번만 실행되는 코드 블록을 지정할 수 있습니다. GCD는 쓰레드 세이프하고 OS가 모든것을 관리해준다는 장점이 있습니다.

MyObject.h

#import <Foundation/Foundation.h>

@interface MyObject : NSObject

+ (instancetype)getInstance;

@end

 MyObject.m

#import "MyObject.h"

@implementation MyObject

+ (instancetype)getInstance {
    static MyObject *_instance = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _instance = [[MyObject alloc] init];
    });
    return _instance;
}

@end

.h 파일에서는 getInstance라는 클래스 메소드를 추가하였고 .m에서는 그 실체를 구현하였습니다.

위에서 중요한것은 dispatch_once_t와 dispatch_once의 상관관계입니다. dispatch_once_t는 dispatch_once가 실행되었는지 여부를 저장하고 있는 포인터 변수입니다. 이 값을 보존하지 못한다면 여러번 실행될 수도 있다는 것이 되겠네요.

추가로 기존의 방식으로 싱글턴을 구현하려면 @synchronized를 활용하는 방법이 있습니다.

#import "MyObject.h"

@implementation MyObject

+ (instancetype)getInstance {
    static MyObject *_instance = nil;
    if (_instance == nil) {
        @synchronized (self) {
            if (_instance == nil)
                _instance = [[MyObject alloc] init];
        }
    }

    return _instance;
}

@end

참조 : Apple GCD Reference

[iPhone] 아무 클래스에서나 UIWindow 객체 가져오기

아이폰 개발을 하다 보면 여러개의 뷰 및 컨트롤들이 겹겹이 쌓이는 형태로 개발을 하게 됩니다.

하지만 이때에 최상위에 있는 UIWindow에 접근할 일이 자꾸 생깁니다. 그럴 경우에는 다음과 같은 방법으로 하시면 됩니다.

[code]UIWindow *window = [[UIApplication sharedApplication] keyWindow];[/code]
위의 명령은 현재 눈에 보이는 화면상에서 가장 최상단에 있는 UIWindow객체를 가져오게 됩니다.

[code]NSArray *array = [[UIApplication sharedApplication] windows];[/code]
혹은 위와 같은 명령을 사용하여 어플리케이션이 가지고 있는 전체 UIWindow 리스트를 가져올 수 있습니다.

출처 : http://forums.macrumors.com/showthread.php?t=464131