[objective-c] Objective-C에서 클래스 수준 속성을 어떻게 선언합니까?

어쩌면 이것은 분명하지만 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코코아 와 같은 것 입니다.