NSMutableData setLength:NSUInteger使应用程序崩溃

时间:2012-11-30 12:48:34

标签: xcode cocoa nsurlconnection nsmutabledata

尝试使用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;

这是头文件的一部分。对于迟到的回复。

2 个答案:

答案 0 :(得分:3)

很可能你没有正确地保留responseData,所以它正在发布,在上面的例子中,你最终得到了在同一个地方分配的NSDictionary。

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

如果你正在使用retain-release,那么你需要在分配responseData时添加一个keep来保留。

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

答案 1 :(得分:0)

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

@property (strong, nonatomic) NSMutableData *responseData;

默认情况下,应使用 self。 responseData;

进行访问

如果您打算访问私有ivar,您应该默认使用_responseData。

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