(Objective-C / Cocoa)Caste Superclass保持不变

时间:2013-01-07 16:01:39

标签: objective-c cocoa casting delegates subclass

我正在研究NSURLConnection的子类。我添加了一些属性和功能。我实现了NSURLConnectionDelegate及其方法。

现在我需要将NSURLConnection(及其属性)传递给我的子类委托。我为此实现了委托协议。

这是一个代码示例:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    if([_delegate respondsToSelector:_didReceiveDataSelector]) {
        [_delegate performSelector:_didReceiveDataSelector withObject:connection];
    }

现在我还需要返回我的子类属性。我试图简单地转换实例:

mySubClass *obj = (mySubClass *)connection;
obj.userInfo = self.userInfo;

但事实证明(NSLog(@"%@", NSStringFromClass([obj class]));)演员表会返回一个对象,该对象的类仍为NSURLConnection。

现在我想知道如何合并超类实例和我的子类属性的所有属性值。

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

转换不会更改对象的类。转换只是告诉编译器“这个对象实际上是一个什么”。这是因为编译器误解了什么类是什么。

鉴于转换似乎不适合您,那么这意味着您没有被传递自定义子类的实例。因此,您应该首先查看创建连接的代码。我希望看到类似的东西:

mySubClass *conn = [[mySubClass alloc] initWithRequest:req delegate:self];

这是你的代码是什么样的?如果不是(例如,如果您创建NSURLConnection而不是mySubClass),请切换为创建mySubClass

答案 1 :(得分:0)

我解决了这个问题。

现在我正在这样做:

- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate {
    self = [super initWithRequest:request delegate:self];
    if(self) {
        _delegate = delegate;
    }
}

这样我就可以在子类上接收委托方法,扩展方法中的信息并将自定义选择器结束到委托。

在viewControllers中,我可以这样做:

mySubClass *con = [[mySubClass alloc] initWithRequest:req delegate:self];
[con setDidReceiveResponseSelector:@selector(connection:didGetResponse)];
[con start];

所以我可以在同一个viewController中使用不同的委托方法进行相同操作的10个URLRequests。