2013-05-29 2 views
0

클래스 메서드에서 대리자를 호출하려고합니다.클래스 메서드에서 대리자 사용

대리자가 클래스 메서드 내에서 액세스되는 인스턴스 변수이기 때문에 아래 예제에서는 분명히 작동하지 않습니다. (오류 : 클래스 메서드에서 액세스 한 인스턴스 변수 'delegate')

경고 메시지가 표시됩니까?

내 헤더 파일 :

내 구현 파일
// MyClass.h 

#import <Foundation/Foundation.h> 

@protocol MyDelegate <NSObject> 

-(void)update; 

@end 

@interface MyClass : NSObject 
{ 
    id<MyDelegate> delegate; 
} 
@property (nonatomic, retain) id delegate; 

+(void)methodThatInvokesDelegate; 
@end 

:

// MyClass.m 
#import "MyClass.h" 

@implementation MyClass 
@synthesize delegate; 

+(void)methodThatInvokesDelegate{ 
[delegate update]; 
} 

@end 
+3

같은 뭔가 정리합니다. 정확히 당신이보고있는 문제는 무엇입니까? –

+0

@MikeM 위는 단지 예일뿐입니다. 내가 실제로 사용하고있는 코드가 아닙니다. 그러나 문제를 설명하기 만하면됩니다. 내 게시물을 편집하고 '@'를 추가했습니다.오류 i ': "인스턴스 변수'delegate '가 클래스 메소드에서 액세스되었습니다. – steak2002

+0

왜 이것을하고 싶습니까? 싱글 톤 패턴을 사용하는 것이 더 좋을 수도 있습니까? – Marcel

답변

3

세 가지 명백한 옵션 :

  • 싱글
  • static 변수 (즉, 클래스 변수)를 가리키는 대의원
  • 는 사용 NSNotification의보다는 싱글 (그리고 정적 변수) 대표의 라이프 사이클을 추적 할 수 없기 때문에 대표

, 나는 옵션이 세 가지가 가장 깨끗한 것 같아요.

+0

통지가 "대상이 지정되지 않았으므로"옵션 3을 사용하지 않습니다. 위임은 "목표"입니다. 목표가 있다면, 위임은 특정 객체를 가리키고 있습니다. –

+0

@ AminNegm-Awad 저는 여러분의 의견을 말합니다. 그러나 여기서는 조금 이상한 일을하려고 노력하고 있습니다. 약간의 파손이 될 수 있습니다. 이 경우 알림은 악의가 적은 것으로 간주합니다. –

+0

이것은 확실히 맛의 주제입니다. 하지만 저는 정적 변수가 아무 것도 없다고 생각합니다. 예를 들어 알림을 사용하면 반환 값을 얻을 수 없습니다. –

0

나는 그 상황에서 달릴 수있는 상황을 알고 싶다. ;-) 어쨌든 :

첫 번째 : 특정 인스턴스 개체에 대한 대리인이 설정됩니다. 이 때문에 같은 (위임) 클래스의 다른 인스턴스에 대해 서로 다른 대리자를 가질 수 있습니다.

둘째 : 클래스 메서드는 해당 클래스의 클래스 개체 내에서 실행됩니다. 이 클래스의 모든 인스턴스 객체와 다른 객체입니다. 따라서 "대의원"이라고 할 수있는 것은 없습니다. 100 명 이상의 대의원을 보유 할 수 있습니다.

세 번째 : 클래스 개체은 자체적으로 대리인이 필요합니다. 따라서 클래스 객체에 delegate 속성을 추가 한 다음이 속성을 사용해야합니다. (예, 속성을 클래스 객체로 가질 수 있습니다. 이 아니라 선언 된 속성을 작성하십시오.)이 작업을 수행하는 방법에 대한 추가 정보가 필요하면 그냥 주석을 달아주세요. 나는 코드를 추가 할 것이다.

0

이 방법이 도움이 될지 잘 모르겠지만 데이터로드에 사용되는 클래스 메서드가있는 비슷한 상황이 있습니다. 이 경우 클래스는 완료 될 때까지 클래스를 인스턴스화 (호출자가 필요하지 않도록)합니다. initWithRequest에 대한 호출이 함께 "자기"통과 - 프로세스를 시작

@protocol DataLoaderDelegate2 <NSObject> 
    - (void) dataLoaderSuccess:(NSData *)data loader:(id)theloader; 
    - (void) dataLoaderFailed:(NSString *)error loader:(id)theloader; 
    @end 

    @interface DataLoader2 : NSObject { 
      NSURLConnection *conn; 
      NSMutableData *receivedData; 
      NSFileHandle *fileHandle; 
      id <DataLoaderDelegate2> delegate; 
    } 
    @property (nonatomic, assign) id<DataLoaderDelegate2>delegate; 

전화 :

헤더 파일을 (이 코드는 여기서 일하기 위해 다소 수정되었다). 데이터 로딩이 완료되면

+ (DataLoader2 *)loadWithURLRequest:(NSURLRequest *)req delegate:(id)_delegate 
    { 
     DataLoader2 *dl = [[DataLoader2 alloc] init]; 
     [dl setDelegate:_delegate]; 
     conn = [[NSURLConnection alloc] initWithRequest:req delegate:self]; 
     return dl; 
    } 

, 그것은 당신이 프로토콜의 앞에 "@"를 놓치고

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
    { 

      if ([delegate respondsToSelector:@selector(dataLoaderSuccess:loader:)]) 
        [delegate dataLoaderSuccess:(fileHandle)?(id)fileHandle:(id)receivedData loader:self]; 
      [self autorelease]; 
    } 
관련 문제