2013-01-10 5 views
2

블록이있는 유지 사이클을 피하는 방법에 대해서는 여기에 많이 게시되지만 클래스 및 클래스 메소드를 사용할 때는 어떻게해야합니까?클래스 유지 카운트

[MyClass doSomethingAsynch:^{ 
    [MyClass doSomethingElse]; 
} 

호출자가 MyClass에의 unsafe_unretained 사본을 선언해야합니다 :

// MyClass.h 

+ (void)doSomethingAsynch:(void (^)(void))block; 
+ (void)doSomethingElse; 

발신자는이 말씀을 전합니다 :이 같은 클래스가 있다고? 또는 싱글 톤과 같은 클래스입니다. 보유 수를 늘리지는 않습니까? 우리가 어쨌든 항상 존재하기를 원하기 때문에 수업의 보유 수를 달에 보내는 것이 중요합니까?

답변

4

[[NSObject class] retainCount] 반환 NSUIntegerMax, 그래서, 그래, 클래스가 싱글 톤으로 구현하고 아마로 release를 오버라이드 (override) 일부 선명도를 추가, 걱정 필요로 할 때, 대부분을 강조 아니.

부록 : 라인 당신이 찾아 1659에서 NSObjectobjc runtime implementation에서

...

+ (id)retain { 
    return (id)self; 
} 

... [NSObject retain]는 아무것도하지 않습니다 있는지 확인합니다.

2

당신이 제안한 것처럼, 클래스는 결코 시스템에 의해 할당 해제되지 않으므로, 클래스를 반복적으로 유지하고 해제하지 않으면 문제가 발생하지 않습니다. 내 생각 엔 클래스의 retain은 아무 것도하지 않을 것입니다.

+0

감사합니다. +1 및 +1/정답은 @ Nikolai b/c에 대한 클래스 유지 카운트에 관한 유용한 경험적 증거입니다. – danh

-1

이러한 메소드를 정적/클래스 메소드 (인스턴스 메소드의 경우 '-'대신 앞면에 '+')로 표시하므로 물론 원하지 않으면이 특정 클래스에 대해 절대 [[MyClass alloc] init]을 수행 할 필요가 없습니다. 이러한 방법을 사용합니다. alloc을 사용하지 않으므로 retain 또는 release에 대해 걱정할 필요가 없습니다. 당신이 대부분에 대한 retainrelease 어쨌든 걱정하지 않아도 ARC (자동 참조 카운팅)와

요즘, 당신을 위해 컴파일 타임에 모든 것을 추가합니다.

편집 : 시간이 있기 때문에 여전히 또한

+0

ARC 하에서조차도 기억 관리에 관해서는 때때로 걱정할 필요가 있기 때문에 누군가가 -1을했다고 생각합니다. 블록의 유지주기가 그 예입니다. – danh

+0

나는 내 대답에 약간의 명확성을 추가하려고 노력했다.이 경우에는 질문에 제공된 내용을 기반으로하는 C#의 정적 메서드가있는 정적 클래스와 동일하다. –