2012-07-13 3 views
1

NSOutputStream의 하위 클래스를 작성하여 매우 간단한 기능을 수행하려고합니다. 스트림으로 보낸 총 바이트 수를 추적합니다. 그러나, 나는 함수의 인스턴스를 초기화하는 예기치 않은 문제로 실행됩니다. 내가 명시 적으로 생성자를 추가하려고했습니다NSOutputStream의 하위 클래스를 만드는 방법

-[TrackingOutputStream initToFileAtPath:append:]: unrecognized selector sent to instance 0x101a187e0 

: 나는 다음과 같은 오류가

TrackingOutputStream *os = [[[TrackingOutputStream alloc] initToFileAtPath:@"/tmp/test" append:NO] autorelease]; 

:이 클래스를 초기화 할 때

#import <Foundation/Foundation.h> 

@interface TrackingOutputStream : NSOutputStream { 
    unsigned long long bytesWritten; 
} 

@property (readonly) unsigned long long bytesWritten; 

@end 

--------------------------- 

#import "TrackingOutputStream.h" 

@implementation TrackingOutputStream 
@synthesize bytesWritten; 

- (NSInteger)write:(const uint8_t *)buffer maxLength:(NSUInteger)length { 
    NSInteger written = [super write:buffer maxLength:length]; 
    bytesWritten += written; 
    return written; 
} 

@end 

, 그러나 다음은 코드입니다 수퍼 클래스를 호출하는 클래스에 전달하지만, 차이를 만들지는 않습니다.

+0

확실하지 않지만 NSOutputStream은 아마도 클래스 클러스터 일 것입니다. 다음은 클래스 클러스터 인 다른 클래스를 하위 클래스로 분류하는 예제입니다. http://cocoawithlove.com/2008/12/ordereddictionary-subclassing-cocoa.html –

답변

1

NSOutputStream에는 class's documentation에 문서화 된 매우 구체적인 서브 클래 싱 요구 사항이 있습니다.

문서에 명시 적으로 적절한 초기화 프로그램을 완전히 구현해야한다는 내용이 명시되어 있습니다. 나는. 설명대로 비헤이비어를 변경하기 위해 하위 클래스로 분류 할 수 없습니다. 적어도, 쉽게.

대신 인스턴스가 NSOutputStream 인 인스턴스를 래핑하고 원하는 동작을 추가하십시오.

1

NSOutputStream의 인스턴스를 필요로하는 API로 작업하는 경우 NSOutputStream의 모든 메소드를 구현하여 랩핑 된 (위임) 인스턴스로 전달할 수 있습니다. 메서드 전달 방법을 사용하면 모든 래퍼 메서드를 작성하지 않고도 비헤이비어를 추가 할 수 있습니다. 이 Objective-C duck-typing to more easily subclass NSOutputStream 사용에 대한 블로그 게시물을 참조하시기 바랍니다 더 이상 자세한 설명은 간단한 forwardingTargetForSelector:의 구현 및 respondsToSelector:


- (id)forwardingTargetForSelector:(SEL)aSelector { 
    if (class_respondsToSelector([self class], aSelector)) { return self; } 
    if ([self.delegate respondsToSelector:aSelector]) { return self.delegate; } 
    return [super forwardingTargetForSelector:aSelector]; 
} 

- (BOOL)respondsToSelector:(SEL)aSelector { 
    if (class_respondsToSelector([self class], aSelector)) { return YES; } 
    if ([self.delegate respondsToSelector:aSelector]) { return YES; } 
    return [super respondsToSelector:aSelector]; 
} 

를 작성하는 것을 포함한다. 또는 https://github.com/jwb/ObjC-DuckType

0

- propertyForKey:NSStream을 사용하여 기록 된 데이터에 대한 정보를 검색 할 수 있어야합니다. NSStreamDataWrittenToMemoryStreamKey 속성 키를 확인하십시오.

관련 문제