답변:
속성은 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;
}
.
-accessor 구문이 목표 - C의 속성에 연결되지 않은, 그것은 그냥 컴파일 된 바로 가기 어떤 방법에 대한 그 어떤 인수를 고려하지 않고 반환 뭔가. 이 경우, 나는 그것을 선호한다. 나는 .
클라이언트 코드가 무언가를 얻거나 의도하지 않은 사용에 대해 구문을 선호 한다 (구현 코드가 한번 무언가를 만들거나 부작용을 수행하더라도) . 사용량 .
이 많은 구문을 사용 하면 코드를보다 쉽게 읽을 수 있습니다. […]
s가 있으면 가져 오기에서 .
구문을 대신 사용할 때 중요한 작업이 수행되고 있음을 의미 합니다.
이 솔루션을 사용하고 있습니다 :
@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);
self
에서 수업 방법 안에서 무엇을 의미합니까?
@synchronized
할까요?
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
static
) 변수는 여전히 선언되고 사용되어야하며 메서드는 이전과 같이 명시 적으로 구현되어야합니다. 도트 구문도 이미 이전에 작동했습니다. 결국 이것은 실제보다 더 큰 것처럼 들립니다.
클래스 레벨에 해당하는 클래스를 찾고 있다면 @property
"아무것도 없습니다"라는 대답이 있습니다. 그러나 @property
어쨌든 구문 설탕 만 기억하십시오 . 적절한 이름의 객체 메소드 만 생성합니다.
다른 사람들과 마찬가지로 정적 변수에 액세스하는 클래스 메소드를 작성하여 구문이 약간 다릅니다.
UIDevice.currentDevice.identifierForVendor
나를 위해 작동합니다.
스레드 안전 방법은 다음과 같습니다.
// 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 - 블록 개체를 한 번만 응용 프로그램의 평생을 실행합니다."
Initializer element is not a compile-time constant
합니다.
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
코코아 와 같은 것 입니다.
Xcode 8부터는 Berbie의 답변에 따라 클래스 속성 속성을 사용할 수 있습니다 .
그러나 구현시 iVar 대신 정적 변수를 사용하여 클래스 특성에 대한 클래스 getter 및 setter를 정의해야합니다.
Sample.h
@interface Sample: NSObject
@property (class, retain) Sample *sharedSample;
@end
Sample.m
@implementation Sample
static Sample *_sharedSample;
+ ( Sample *)sharedSample {
if (_sharedSample==nil) {
[Sample setSharedSample:_sharedSample];
}
return _sharedSample;
}
+ (void)setSharedSample:(Sample *)sample {
_sharedSample = [[Sample alloc]init];
}
@end
클래스 수준 속성이 많은 경우 싱글 톤 패턴이 순서대로 표시 될 수 있습니다. 이 같은:
// Foo.h
@interface Foo
+ (Foo *)singleton;
@property 1 ...
@property 2 ...
@property 3 ...
@end
과
// Foo.m
#import "Foo.h"
@implementation Foo
static Foo *_singleton = nil;
+ (Foo *)singleton {
if (_singleton == nil) _singleton = [[Foo alloc] init];
return _singleton;
}
@synthesize property1;
@synthesize property2;
@synthesise property3;
@end
이제 다음과 같이 클래스 레벨 속성에 액세스하십시오.
[Foo singleton].property1 = value;
value = [Foo singleton].property2;
dispatch_once
여기 를 사용하는 것은 매우 쉽습니다 .