2012-04-12 8 views
1

예 :블록을 ivar로 선언하기 위해 어떤 한정어를 사용해야합니까?

 
typedef void(^responseBlock)(NSDictionary*, NSError *); 
@interface MyClass : NSObject 
{ 
    [??] responseBlock responseHandler; 
} 

내가 [?] 괄호 안에 무엇 규정해야합니까?

속성이 복사 한정자로 설정되어야하므로 블록을 읽었습니다 ...하지만이 경우에는 속성으로 노출 된 블록이 필요하지 않습니다. 나는 단지 그것을 ivar로 유지하기를 원하지만 어떻게 사본을 지정할 수 있습니까? 또한 아무 것도 지정하지 않고 기본 한정자는 무엇입니까? 그 밖의 모든 것의 경우와 같이 __ 강한 것인가?

ios5에서 ARC를 사용하고 있습니다.

답변

5

예, 블록은 ObjC의 개체이므로 __strong이 적절한 한정자입니다. 이것이 기본값이기 때문에 실제로 해제 할 수 있습니다.

블록을 속성없이 할당시 복사하도록 지정하는 것은 불가능합니다. 귀하의 책임입니다 (responseHandler = [someBlock copy];). (합성되는시)

@interface MyClass() 
@property (copy) responseBlock responseHandler; 
@end 

이 당신에게 일반적인 접근 방법을 제공합니다 : 당신은 당신의하는 .m 파일에 클래스 확장을 넣어 (다른 코드에서 사용할 수 없습니다)이 클래스 자체 만 볼 수의 속성을 선언 할 수 , 당신이 그들을 사용할 때 당신을 위해 복사본을 돌볼 것입니다.

@implementation 블록에서 인스턴스 변수를 선언하는 것이 가능하고 (now the recommended procedure) 알아 두십시오. 이 속성을 개인 속성 (속성 액세스 없음)으로 지정하고 ivars가 다른 코드에서는 볼 수 없다고 선언 한 것처럼 들립니다. (물론 당신은 당신이 속성을 사용하는 경우이 작업을 수행 할 필요가 없습니다; @synthesize 당신을 위해 바르를 생성합니다.) 우수한

@implementation MyClass 
{ 
    responseBlock responseHandler; 
} 

// Continue with implementation as usual 
+0

이 나를 위해 꽤 몇 가지를 지 웁니다. 상세한 응답을 주셔서 감사 드리며, 구현 과정에서 새로 도입 된 ivars를 선언하는 연습을 부탁드립니다. –

관련 문제