문제

이미지 사전을 저장하기 위해 정적 변수를 만들려고했습니다. 불행히도, 초기화 할 수있는 가장 좋은 방법은 변수를 사용한 각 기능을 확인하는 것이 었습니다. 카테고리 내 에서이 변수를 만들고 있으므로 이니시 라이저 내부에서 초기화 할 수는 없습니다. 내비게이션 교수형을 초기화하는 깔끔한 방법이 있습니까?

static NSMutableDictionary *navigationBarImages = NULL;

@implementation UINavigationBar(CustomImage)
//Overrider to draw a custom image
- (void)drawRect:(CGRect)rect
{
    if(navigationBarImages==NULL){
        navigationBarImages=[[NSMutableDictionary alloc] init];
    }
    NSString *imageName=[navigationBarImages objectForKey:self];
    if (imageName==nil) {
        imageName=@"header_bg.png";
    }
    UIImage *image = [UIImage imageNamed: imageName];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

//Allow the setting of an image for the navigation bar
- (void)setImage:(UIImage*)image
{
    if(navigationBarImages==NULL){
        navigationBarImages=[[NSMutableDictionary alloc] init];
    }
    [navigationBarImages setObject:image forKey:self];
}
@end
도움이 되었습니까?

해결책

__attribute__((constructor))
static void initialize_navigationBarImages() {
  navigationBarImages = [[NSMutableDictionary alloc] init];
}

__attribute__((destructor))
static void destroy_navigationBarImages() {
  [navigationBarImages release];
}

이 기능은 프로그램이 시작되고 종료되면 자동으로 호출됩니다.

다른 팁

이 접근법을 고려하십시오.

static NSMutableDictionary *navigationBarImages()
{
    static NSMutableDictionary *dict = NULL;
    if(dict == NULL)
    {
        dict = [[NSMutableDictionary alloc] init];
    }
    return [[dict retain] autorelease];
}

그런 다음 사용할 때마다 NavigationBarimages, 그것을 교체하십시오 NavigationBarimages (), 이와 같이:

변화

NSString *imageName=[navigationBarImages objectForKey:self];

에게

NSString *imageName=[navigationBarImages() objectForKey:self];

함수 호출 오버 헤드가 귀찮은 경우, 임시 변수를 사용하여 NavigationBarimages ()의 반환을 포착 할 수 있습니다.

NSMutableDictionary *dict = navigationBarImages();
[dict doSomething];
[dict doSomething];

단점은 일단 NavigationBarimages ()라고 불렀다.

사용하기 전에 알려진 지점에서 정적을 한 번 설정하는 것입니다. 예를 들어, nsapplication delegate를 설정하고 작업을 수행 할 수 있습니다. -applicationDidFinishLaunching:

한 가지 옵션은 C ++를 사용하는 것입니다. 파일의 확장자를 .mm으로 변경하고 교체하십시오 = NULL ~와 함께 [[NSMutableDictionary alloc] init].

당신은 추가 할 수 있습니다 +initialize 카테고리의 .M 파일에서 - 기존 구현을 분쇄하지 않거나 일반적인 Wonkiness를 얻을 수 있는지 확인하면됩니다. (분명히, 당신은 코드를 작성하면 이것을 확신 할 수 있지만, 타사 코드를 사용하면 이것이 최선의 접근법이 아닐 것입니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top