NSMutableARRAY 설정 - 누군가이 코드 스 니펫이 무엇을하는지 설명 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1137127

  •  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 변수의 범위를 파일에만 제한합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top