0

尝试使用 URL 创建请求的连接。NSMutableData 实例 (responseData) 也会被调用。当连接开始接收响应时,在 NSMutableData 实例上调用 setLength:NSUInteger 方法。

-(void)startDataDownloading
{
    NSURLRequest *_request = [NSURLRequest requestWithURL:self.url];
    if (_request) {
        if (!connecton) {
            connecton = [NSURLConnection connectionWithRequest:_request delegate:self];
            if (connecton) {
                responseData = [NSMutableData data];
                [connecton start];
            }
        }
    }
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [responseData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [responseData appendData:data];
}

但不知何故,它会导致崩溃,并在 setLength 调用上发出警告。该错误指出

" -[__NSCFDictionary setLength:]: 无法识别的选择器发送到实例 0x6a8cf70 2012-11-30 18:00:38.948 RSSReader[8997:f803] *由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'-[__NSCFDictionary setLength:] : 无法识别的选择器发送到实例 0x6a8cf70'"

对此的任何提示将不胜感激。

#import <Foundation/Foundation.h>
#import "DataParser.h"

@protocol DataConnectionDelegate <NSObject>
//protocol methods
@end
@interface UCDataConnection : NSObject <ModelParser>
@property (nonatomic, strong) NSURL *url;
@property (nonatomic, strong) NSURLConnection *connecton;
@property (strong, nonatomic) NSMutableData *responseData;
@property (nonatomic, assign) id<DataConnectionDelegate> delegate;
-(void)startDataDownloading;
- (id)initWithUrl:(NSURL *)_url andDelegate:(id<DataConnectionDelegate>)_delegate;

这是头文件的一部分。抱歉,回复晚了。

4

2 回答 2

3

很可能您没有正确保留 responseData,因此它被释放了,在上面的示例中,您碰巧最终在同一个地方分配了一个 NSDictionary。

如果您使用的是 ARC,那么您发布的代码就可以了(除了“responseData”应该有一个下划线前缀,假设它是一个实例变量)。

如果您使用的是retain-release,那么您需要在分配responseData 时添加一个retain 调用。

更新:根据您的头文件,您似乎直接引用了实例变量,并使用了retain-release。您最好的选择是仅通过属性机制引用 responseData - 即在其所有使用前加上self..

于 2012-11-30T15:02:36.533 回答
0

我不知道这是否是答案,但我在这里看到的可疑之处是你有一个财产

@property (strong, nonatomic) NSMutableData *responseData;

默认情况下,它应该使用self 访问。响应数据;

如果您打算访问私有 ivar,则默认情况下应使用 _responseData。

除非你在我也想看到的 .m 文件中说不同,所以要确定发生了什么(以防这个答案没有帮助)。

于 2012-12-01T12:37:21.453 回答