컴파일러 오류 : "초기화 요소가 컴파일 시간 상수가 아닙니다."
이 코드를 컴파일 할 때 "초기화 요소가 컴파일 시간 상수가 아닙니다"라는 오류가 발생합니다. 아무도 이유를 설명 할 수 있습니까?
#import "PreferencesController.h"
@implementation PreferencesController
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
}
return self;
}
NSImage* imageSegment = [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];//error here
함수 범위 밖에서 변수를 정의하면 해당 변수의 값이 실제로 실행 파일에 기록됩니다. 즉, 상수 값만 사용할 수 있습니다. 컴파일 타임에 런타임 환경에 대한 모든 것을 알지 못하기 때문에 (사용 가능한 클래스, 구조 등) 런타임까지 객관적인 c 객체를 만들 수 없습니다. 그 구조를 유지하고 있습니다. 해야 할 일은 변수를 nil로 초기화하고 +initialize
이미지를 만드는 데 사용 하는 것입니다. initialize
클래스에서 다른 메서드가 호출되기 전에 호출되는 클래스 메서드입니다.
예:
NSImage *imageSegment = nil;
+ (void)initialize {
if(!imageSegment)
imageSegment = [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];
}
- (id)init {
self = [super init];
if (self) {
// Initialization code here.
}
return self;
}
전역 변수는 4
또는 0.0
또는 @"constant string"
또는 같은 상수 값으로 초기화되어야합니다 nil
. 와 같은 객체 생성자 init
는 상수 값을 반환하지 않습니다.
전역 변수를 가지려면 초기화 nil
한 다음 클래스 메서드를 사용하여 반환해야합니다.
NSImage *segment = nil;
+ (NSImage *)imageSegment
{
if (segment == nil) segment = [[NSImage alloc] initWithContentsOfFile:@"/user/asd.jpg"];
return segment;
}
컴파일러에게 본질적으로 동적 인 코드로 정적 변수를 초기화하도록 요청하기 때문입니다.
그 이유는 imageSegment
소스 코드 (정적 변수)에서 함수 외부를 정의하기 때문입니다 .
이러한 경우 초기화에는 함수 호출이나 클래스 할당과 같은 코드 실행이 포함될 수 없습니다. 이니셜 라이저는 컴파일 타임에 값이 알려진 상수 여야합니다.
그런 다음 init
메서드 내에서 정적 변수를 초기화 할 수 있습니다 (선언을 init로 연기 한 경우).
아래에 표시된대로 확실히 매크로를 #define 할 수 있습니다. 컴파일러는 컴파일 전에 "IMAGE_SEGMENT"를 해당 값으로 바꿉니다. 배열에 대한 전역 조회를 정의 할 수 있지만 전역 변수와 동일하지는 않습니다. 매크로가 확장되면 인라인 코드처럼 작동하므로 매번 새 이미지가 생성됩니다. 따라서 매크로를 사용하는 위치에주의를 기울이면 전역 변수를 효과적으로 만들 수 있습니다.
#define IMAGE_SEGMENT [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];
그런 다음 아래와 같이 필요한 곳에 사용하십시오. 아래 코드가 실행될 때마다 새 메모리 포인터로 새 객체가 생성됩니다.
imageSegment = IMAGE_SEGMENT
'Programing' 카테고리의 다른 글
루프에서 함수 만들기 (0) | 2020.10.24 |
---|---|
Boost Library 프로그램 옵션을 사용하는 필수 및 선택적 인수 (0) | 2020.10.24 |
웹 사이트의 한 섹션을 번역하지 않도록 Google 번역에 어떻게 지시 할 수 있습니까? (0) | 2020.10.24 |
이름이 지정되지 않은 또 다른 CacheManager가 동일한 VM (ehCache 2.5)에 이미 있습니다. (0) | 2020.10.24 |
Grunt는 무엇입니까? (0) | 2020.10.24 |