어쩌면 이것은 분명하지만 Objective-C에서 클래스 속성을 선언하는 방법을 모르겠습니다.
클래스별로 사전을 캐시하고 클래스에 사전을 넣는 방법이 궁금합니다.
답변
속성은 Objective-C에서 특정 의미를 갖지만 정적 변수와 동등한 것을 의미한다고 생각합니까? 예를 들어 모든 유형의 Foo에 대해 하나의 인스턴스 만?
Objective-C에서 클래스 함수를 선언하려면 대신 + 접두사를 사용하므로 구현은 다음과 같습니다.
// Foo.h
@interface Foo {
}
+ (NSDictionary *)dictionary;
// Foo.m
+ (NSDictionary *)dictionary {
static NSDictionary *fooDict = nil;
if (fooDict == nil) {
// create dict
}
return fooDict;
}
답변
이 솔루션을 사용하고 있습니다 :
@interface Model
+ (int) value;
+ (void) setValue:(int)val;
@end
@implementation Model
static int value;
+ (int) value
{ @synchronized(self) { return value; } }
+ (void) setValue:(int)val
{ @synchronized(self) { value = val; } }
@end
그리고 Singleton 패턴을 대체하는 데 매우 유용하다는 것을 알았습니다.
사용하려면 간단히 점 표기법으로 데이터에 액세스하십시오.
Model.value = 1;
NSLog(@"%d = value", Model.value);
답변
WWDC 2016 / XCode 8 ( LLVM 세션 @ 5 : 05 의 새로운 기능 )에 나와 있습니다. 클래스 속성은 다음과 같이 선언 할 수 있습니다
@interface MyType : NSObject
@property (class) NSString *someString;
@end
NSLog(@"format string %@", MyType.someString);
클래스 속성은 절대 합성되지 않습니다.
@implementation
static NSString * _someString;
+ (NSString *)someString { return _someString; }
+ (void)setSomeString:(NSString *)newString { _someString = newString; }
@end
답변
클래스 레벨에 해당하는 클래스를 찾고 있다면 @property
“아무것도 없습니다”라는 대답이 있습니다. 그러나 @property
어쨌든 구문 설탕 만 기억하십시오 . 적절한 이름의 객체 메소드 만 생성합니다.
다른 사람들과 마찬가지로 정적 변수에 액세스하는 클래스 메소드를 작성하여 구문이 약간 다릅니다.
답변
스레드 안전 방법은 다음과 같습니다.
// Foo.h
@interface Foo {
}
+(NSDictionary*) dictionary;
// Foo.m
+(NSDictionary*) dictionary
{
static NSDictionary* fooDict = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
// create dict
});
return fooDict;
}
이러한 편집은 fooDict가 한 번만 작성되도록합니다.
에서 애플 문서 : “dispatch_once – 블록 개체를 한 번만 응용 프로그램의 평생을 실행합니다.”
답변
Xcode 8부터 Objective-C는 이제 클래스 속성을 지원합니다.
@interface MyClass : NSObject
@property (class, nonatomic, assign, readonly) NSUUID* identifier;
@end
클래스 속성은 합성되지 않으므로 직접 구현해야합니다.
@implementation MyClass
static NSUUID*_identifier = nil;
+ (NSUUID *)identifier {
if (_identifier == nil) {
_identifier = [[NSUUID alloc] init];
}
return _identifier;
}
@end
클래스 이름에 일반 도트 구문을 사용하여 클래스 속성에 액세스합니다.
MyClass.identifier;
답변
속성은 클래스가 아닌 객체에만 값을 갖습니다.
클래스의 모든 객체에 무언가를 저장해야하는 경우 전역 변수를 사용해야합니다. static
구현 파일에서 선언하여 숨길 수 있습니다 .
또한 객체 간의 특정 관계 사용을 고려할 수도 있습니다. 마스터의 역할을 클래스의 특정 객체에 부여하고 다른 객체를이 마스터에 연결합니다. 마스터는 사전을 간단한 속성으로 보유합니다. Cocoa 응용 프로그램의 뷰 계층 구조에 사용되는 트리와 같은 트리를 생각합니다.
또 다른 옵션은 ‘클래스’사전과이 사전과 관련된 모든 개체 집합으로 구성된 전용 클래스의 개체를 만드는 것입니다. 이것은 NSAutoreleasePool
코코아 와 같은 것 입니다.
