Xcode NSMutableData setLength:应用程序崩溃

Xcode NSMutableData setLength:应用程序崩溃,xcode,cocoa,nsurlconnection,nsmutabledata,Xcode,Cocoa,Nsurlconnection,Nsmutabledata,正在尝试使用URL创建请求的连接。NSMutableData实例(responseData)也会被调用。当连接开始接收响应时,会在NSMutableData实例上调用setLength:nsInteger方法 -(void)startDataDownloading { NSURLRequest *_request = [NSURLRequest requestWithURL:self.url]; if (_request) { if (!connecton) {

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

-(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调用上发出警告,导致崩溃。错误表明

“-[\uu NSCFDictionary setLength:]:发送到实例0x6a8cf70的选择器无法识别 2012-11-30 18:00:38.948 RSSReader[8997:f803]*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[\uu nscfdiary 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;
#导入
#导入“DataParser.h”
@协议DataConnectionLegate
//协议方法
@结束
@接口UCDataConnection:NSObject
@属性(非原子,强)NSURL*url;
@属性(非原子,强)NSURLConnection*connecton;
@属性(强,非原子)NSMutableData*响应数据;
@属性(非原子,赋值)id委托;
-(无效)开始数据下载;
-(id)initWithUrl:(NSURL*)\u url和delegate:(id)\u delegate;

这是头文件的一部分。很抱歉响应太晚。

很可能您没有正确地保留responseData,因此正在发布它,在上面的示例中,您恰好在同一位置获得了一个NSDictionary分配

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

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


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

前缀。很可能您没有正确地保留responseData,因此正在释放它,在上面的示例中,您恰好得到了在同一位置分配的NSDictionary

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

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


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

我不知道这是否是答案,但我认为可疑的是您有一个属性

@property (strong, nonatomic) NSMutableData *responseData;
默认情况下,应使用self.responseData访问它

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


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

我不知道这是否是答案,但我认为可疑的是你有一个财产

@property (strong, nonatomic) NSMutableData *responseData;
默认情况下,应使用self.responseData访问它

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


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

我认为需要更多的代码来查看发生了什么。实际上,我将从URL解析RSS提要链接。所以url包含url链接。@Zen附议@ride.inc所说的内容,但我会详细说明:即使
responseData
应该是
NSMutableData
,但您的编译器告诉您它实际上是一本字典。您是否有可能将
responseData
声明为
NSMutableDictionary
?是否有某个地方,
responseData
实际存储了对词典的引用?我认为@trudyscosing是对的,我同意他的观点,这就是为什么我认为您需要向我们展示整个类和头文件,因此,我们可以确定问题。@ride.inc感谢您调查此事。我已使用头文件代码更新了问题。ResponseData的属性为strong,它是一个NSMutableData实例。尽管如此,编译器还是明白了这一点,因为对于像我这样的初学者来说,NSMutableDictionary有点让人困惑。我认为需要更多的代码来了解发生了什么。实际上,我将从URL解析一个RSS提要链接。所以url包含url链接。@Zen附议@ride.inc所说的内容,但我会详细说明:即使
responseData
应该是
NSMutableData
,但您的编译器告诉您它实际上是一本字典。您是否有可能将
responseData
声明为
NSMutableDictionary
?是否有某个地方,
responseData
实际存储了对词典的引用?我认为@trudyscosing是对的,我同意他的观点,这就是为什么我认为您需要向我们展示整个类和头文件,因此,我们可以确定问题。@ride.inc感谢您调查此事。我已使用头文件代码更新了问题。ResponseData的属性为strong,它是一个NSMutableData实例。尽管如此,对于像我这样的初学者来说,NSMutableDictionary有点让人困惑,编译器还是能理解。是的,这很有帮助。将一个圆弧项目更改为非圆弧项目,只需将其禁用即可。直接调用实例变量。谢谢。真的,是的,这很有帮助。将一个圆弧项目更改为非圆弧项目,只需将其禁用即可。直接调用实例变量。谢谢。真正地