2011-11-30 3 views
1

다른 클래스에서 액세스 할 수 있도록 정적 UIImage 갖고 싶어. 나는이 방법을 시도했지만 작동하지 않았다 : 전체 응용 프로그램에서 정적 UIImage

함께 Constans.h 파일을 제작 :

static UIImage *myImage; 

그리고 그 후 내가이 필요한이 헤더를 가져옵니다. 나는이 순간에 myImage이 정적이었고이 객체에 대한 모든 변경 사항이 어디에서나 볼 수 있다고 생각했습니다. 하지만 모든 클래스가 자체적으로 작업하고있는 것 같습니다. myImage 인스턴스입니다. 같은 정적 UIImage 가질 수있는 방법이 있습니까?


편집 :

재산권 AppDelegate에에서 잘 작동합니다. 나는 정적 인 UIImage를 가지고있다. 그러나 아직도 내가 기대하고 있었던 효과가 없다.

ViewController에 UIImageView가 있습니다. 내 delegate.myImage에 이미지를로드하고 내가 할 후 :

:

delegate.myImage = [UIImage imageNamed:@"blah.png"]; 
myImageView.image = delegate.myImage; 

이미지로드,하지만 난 AppDelegate에 그것을 변경할 후,하지만 난이 방법을 myimage을을 변경할 때

delegate.myImage = [UIImage imageNamed:@"blah2.png"]; 

아무 변경 사항이 없습니다 myImageView. 나는 그것이 myImageView.image 영향을주지 않는 것 myimage을의 기준을 변경하면 너무 후 myimage을myImageView.image = delegate.myImage 복사 메모리 주소 같아요. 나는 UIImage를 가지고 싶었는데 변경 후에도 myImageView에 영향을 미칠 것이다.

AppDelegate에서 myImageView을 참조하는 것 외에 다른 방법이 있습니까?

+0

appDelegate 클래스의 속성으로 설정합니다. inSelf의 appDelegate 클래스 객체가 정적 복사이기 때문에. – Ishu

답변

1

에 따라 경우

static 키워드는 컴파일 단위 내부의 변수 끈적하게 (특히 목표 - C 또는 iOS 관련이 없습니다).

#include (또는 ObjC의 경우 #import) 헤더가 포함되어 있습니다 (내용이 &을 포함하는 파일에 붙여 넣은 것과 같습니다). 다시 말해, ".h"파일은 컴파일되지 않습니다 (컴파일 된 ".m"파일에 포함되어 있습니다).

동일한 코드 행을 입력하는 것과 똑같은 방식으로 작동합니다 .h 어떤 파일에서든지 그 파일은 #include입니다.

이것은 각각의 소스 파일에서 #include "Constants.h" 인 각각이 myImage 변수의 다른 인스턴스를 보는 이유를 설명합니다.


대신 당신이해야 :

  • 싱글 톤 패턴를 사용하여, 그는 특히 이러한 경우
  • 또는 구현 파일 ("Constants.m")에 정적 키워드를 사용을 위해 만들어 이 "Constants.m"파일의 컴파일 단위 내에서이 변수를 sticky하게 만들려면

I highl 어쨌든 그런 경우에 싱글 톤 패턴을 사용하는 것이 좋습니다.. More info on Singleton Pattern here in the Apple official DevPedia

0

iPhone에서 AppDelegate 클래스는 정적 클래스를 사용합니다. 따라서 Constant.hYourAppDelegate 클래스에서 수행 한 것과 동일한 작업을 수행 할 수 있습니다. 그러나 정적 키워드를 사용하지 마십시오.

나는별로 확신하지는 않지만 제대로 작동 할 것이라고 생각합니다. :)

3

키워드 static은 id가 정의 된 편집 단위에 로컬 변수를 만듭니다. 즉, 동일한. 기호를 여러 .c 파일에 안전하게 정의 할 수 있습니다. 모든 선언은 충돌하지 않으며 각 파일에는 고유 한 기호가 있습니다.

간단히 말해서 프로그램의 모든 부분에서 액세스하는 전역 변수를 정의하려는 경우 static 키워드가 필요하지 않습니다.

extern UIImage *myImage; 

다음 하나 하나에 그 변수에 대한 정의를 제공합니다 :이 경우에는 그래도 "트릭은"이 같은 (당신이 볼 수 있어야 모든 곳에서 세계 포함하는 것이) 헤더 파일에 변수를 선언하다 static 키워드가없는 장소 (.c 파일). extern 키워드는 해당 기호에 대한 정의가 현재 컴파일 단위 (.c 파일) 내부에는 없지만 다른 기호에 있음을 컴파일러에 알립니다.

다른 많은 사람들이 지적한 것처럼 이제는 singleton to mask a global variable is usually a way to mask a design problem을 사용하는 것으로 나타 났지만 싱글 톤을 사용하여 더 잘 수행 할 수 있습니다.

0

이 그림을 얻으려면 UIImage 범주를 예제로 사용할 수 있습니다.

.h 파일에 정적 메서드 만 추가하면됩니다.

#import <UIKit/UIKit.h> 

@interface UIImage (StaticImage) 

+(UIImage *)staticImage; 

@end 

그리고.당신은이 같은 delegate 개체에서있는 UIImage에 대한 액세스를 앱 위임에 당신이 그때 AppDelegate *delegate=(AppDelegate *)[[UIApplication sharedApplication] delegate];을 만들 수있는 이미지를 사용하려면 모든 클래스의 @property (nonatomic, retain) UIImage *image; 만들 수 있습니다

#import "UIImage+StaticImage.h" 

//This is your static image 
static UIImage *myStaticImage; 

@implementation UIImage (StaticImage) 

+(void)initialize{ 
    //Important to add this condition, because this method will be called for every 
    //child class of UIImage class 
    if (self == [UIImage class]){ 
     myStaticImage = [[UIImage alloc] init]; 
    } 
} 

+(UIImage *)staticImage{ 
    //Just return your existing static image 
    return myStaticImage; 
} 

@end 
1

: m 파일은 다음 단계를 수행

[imageView setImage:[delegate image]]; 

또는이 같은 클래스를 사용할 수 있습니다

헤더 파일을

@interface Data : NSObject 

@property (nonatomic, strong) UIImage *image; 

+ (Data *)sharedInstance; 
+ (id)allocWithZone:(NSZone*)zone; 
- (id)init; 
- (id)copyWithZone:(NSZone *)zone; 

@end 

구현 파일 다음

@implementation Data 

@synthesize image; 

static Data *sharedInstance=nil; 

+ (Data *)sharedInstance { 

    if (sharedInstance == nil) { 
     sharedInstance = [[super allocWithZone:NULL] init]; 
    } 

    return sharedInstance; 
} 

+ (id)allocWithZone:(NSZone*)zone { 
    return [self sharedInstance]; 
} 

- (id)init 
{ 
    self = [super init]; 

    if (self) { 

    } 
    return self; 
} 

- (id)copyWithZone:(NSZone *)zone { 
    return self; 
} 

@end 

, 당신은 당신이 원하는 모든 클래스에 Data.h을 가져와야하고 사용

UIImageView *imageView=[[UIImageView alloc] init]; 
[imageView setImage:[[Data sharedInstance] image]]; 

이 나를 위해 잘 작동합니다 :)

4

을 오히려을보다 명시 적으로 응용 프로그램 전체 이미지, 그냥 [UIImage imageNamed:]을 사용하십시오. 이것은 당신을 위해 이미지의 캐싱을 처리합니다! 이미지를 사용할 필요가 Whereever, 너무처럼 액세스 :

[UIImage imageNamed:@"imageName.png"] 

참고 :이 메모리에 이미지의 단일 복사본이있을 원인이됩니다. 언로드 할 수는 없지만 최신 버전의 iOS는 메모리가 부족한 상태에서 배후에서 언로드 할 수 있습니다.

[UIImage imageNamed:]에 대한 API 문서를 참조하십시오.

Btw, imageNamed는 여러 번 사용되는 작은 이미지에 자주 사용됩니다. 표 셀 이미지 - 정적 앱 전체 이미지가 진정으로 필요한 경우 큰 이미지에는 사용하지 않아도됩니다.

관련 문제