2011-10-13 1 views
4

내 시나리오는 다음과 같습니다. 나는 클래스 A를 가지고있다. 그 구현 안에서는 B 타입의 객체를 만들고 B의 델리게이트를 self로 설정한다. (따라서 클래스 A의 구현 내부에있는 B.delegate = self). 물론ARC 문제 - 위임 방법을 전달할 수 없습니까?

"선택 printThis에 대해 알려진 바 없음 인스턴스 메소드"

그리고 클래스 A는 인스턴스 메서드 B의 구현 내부 지금 - (void)printThis;

, 내가 [delegate printThis];을하려고 할 때, 그것은 내게 오류를 준다있다 이것이 내가 ARC를 사용할 때입니다. 위의 위임 패턴은 ARC없이 iOS 4.x에서 제대로 작동하는 데 사용되었습니다. 그리고 ARC 스위치를 끄면 여전히 작동합니다. ARC와 대리인에게 전달되는 메시지는 무엇입니까?

해골 코드 :

A.h

@class B; 

@interface A: blah blah 
{ 
    B objB; 
} 

-(void) printThis; 

A.m

objB = [[B alloc] init]; 
objB.delegate = self; 

- (void)printThis { 
    //doSomething 
} 

B.h

@interface B: blah blah 
{ 
    //id delegate; //used to be there, now I just property & synthesize 
} 

@property (nonatomic,weak) id delegate; 

B.m

@synthesize delegate; 

[delegate printThis]; //error with ARC ON, works with OFF 

중요 편집 :

그리고 마음 당신이 여기 저기 방법에 대해 발생합니다. 예를 들어, 오류없이 작동하는 A printThat 등 기타 몇 가지 방법이 있습니다. 나는 일어나고있는 것에 관해서 단서가 없다!

+0

궁금한 점이 있으십니까? ivar에 직접 액세스하는 대신에'delegate'에 대한 getter를 직접 사용해 본다면 여전히 ARC에 문제가 있습니까? 어느 쪽이든 프로토콜을 사용하는 것이 더 나은 디자인입니다. –

답변

6

프로토콜에 -printThis을 정의하고 A가이 프로토콜을 구현하도록해야합니다. 또한 위임자를이 대리인을 준수하는 것으로 표시해야합니다.

은 즉 : ARC는 메소드의 인터페이스에 대해 알 필요가

@protocol Printer <NSObject> 

- (void)printThis; 

@end 

@interface A : NSObject <Printer> 
//... 
@end 

@interface B : //... 

@property (nonatomic, weak) id<Printer> delegate; 

@end 

가 제대로 메모리를 제대로 관리하기 위해 호출합니다. 정의가 없다면 불평 할 것입니다.

+0

제 질문은 이것이 ARC를 사용하는 것과 어떻게 관련이 있습니까? 그것은 잘 작동합니다. ARC OFF와 iOS 4.x는 물론 5.0에서도 작동합니다. – Bourne

+0

업데이트 대답 ... – hypercrypt

+0

잘 작동하는 데 사용되는 것처럼 컴파일러 오류입니다. 모든 컴파일러 오류 및 경고를 수정하십시오. – zaph