NSMutableARRAY 설정 - 누군가이 코드 스 니펫이 무엇을하는지 설명 할 수 있습니까?
-
16-09-2019 - |
문제
그물 에서이 코드 스 니펫을 찾았습니다. 이전에 보지 못한 방식으로 NSMutableARRAY를 설정합니다 (저는 OBJ-C Newb입니다). 누군가가 무엇을하고 있는지, 왜 이런 식으로 할 것인지 설명 할 수 있습니까? 특히 메소드 서명의 @syncronized, 정적 및 작은 플러스 부호.
add the following to the .h file:
+(NSMutableArray *)allMySprites;
add the following to he .m file after implementation:
static NSMutableArray * allMySprites = nil;
+(NSMutableArray *)allMySprites {
@synchronized(allMySprites) {
if (allMySprites == nil)
allMySprites = [[NSMutableArray alloc] init];
return allMySprites;
}
return nil;
}
해결책
다른 응답에 추가 ... 게시 된 코드가 잘못되었습니다. 더와 같아야합니다.
@implementation SpriteManager
+ (NSMutableArray*) allMySprites {
@synchronized(self) {
if (allMySprites == nil) {
allMySprites = [[NSMutableArray alloc] init];
}
}
return allMySprites;
}
@end
nil에서 @synchronize는 의미가 없습니다. 클래스 메소드에서 self를 사용하면 인스턴스가 아닌 클래스를 나타냅니다. 또한 원래 코드의 '반환 nil'은 무의미합니다.
@synchronized를 완전히 피할 수있는 더 나은 접근법은 클래스 이니셜 라이저 메소드를 사용하는 것입니다.
@implementation SomeClass
+ (void) initialize
{
allMySprites = [[NSMutableArray alloc] init];
}
@end
초기화 방법은 클래스를 사용하기 전에 호출됩니다.
다른 팁
그만큼 +
부호는 메소드를 나타냅니다 static
반대로 instance
행동 양식. 그것은 메소드가 클래스의 각 인스턴스보다는 클래스에 속한다는 것을 의미합니다 ( static
Java와 C#의 물건). @synchronized
지정된 객체의 잠금을 얻습니다 (처럼 lock
C#의 진술). 다른 스레드가 입력 할 수 없음을 의미합니다 @synchronized
그 대상으로 차단하십시오.
코드 전체는 처음으로 싱글 톤 컬렉션을 초기화하려고 시도하고 (아직 초기화되지 않은 경우) 해당 메소드에 대한 후속 호출에 사용하기 위해 캐시를 만들려고합니다. 동기화 된 블록은 a 중요한 섹션 두 스레드가 여전히 초기화를 수행하는 동안 두 개의 스레드가 대략 동시에 값을 얻으려고 시도하는 경주 조건의 경우 초기화 부품을 안전하게 만듭니다.
그것은 구현입니다 싱글 톤 디자인 패턴, 기본적으로 귀하는 귀하가 귀하의 사본을 하나만 가지고 있는지 확인하는 방법입니다. MySprites
.
세부 사항 :
- 그만큼
+
이것은 이것이 클래스 방법임을 의미합니다 - 그만큼
@syncyronize
에 액세스합니다allMySprites
가변 스레드 안전 (몇 가지 경고가 있지만 한 줄 요약입니다) - 나는 그것을 믿는다
static
변수의 범위를 파일에만 제한합니다.