我正在使用Afnetworking 3.0版并试图加载一些数据。数据正确地进入响应对象,我试图在NSMutableArray
中解析它。然而,这是崩溃给我错误 -
"警告:无法加载任何Objective-C类信息。这将显着降低可用类型信息的质量。"
我的数据解析课正在关注 -
DataProcessing.h -
#import <Foundation/Foundation.h>
#import "Book.h"
#import <AFNetworking/AFHTTPSessionManager.h>
#import <MBProgressHUD/MBProgressHUD.h>
@interface DataProcessing : NSObject
-(void)getAllTheBooks;
-(void)setBookList:(NSMutableArray*)list;
-(NSMutableArray*)getBookList;
@end
DataProcessing.m:
#import "DataProcessing.h"
@interface DataProcessing(){
Book *individualBook;
}
@property(nonatomic, strong) NSMutableArray *bookList;
@property(nonatomic, strong) BookDetails *bookDetails;
@end
@implementation DataProcessing
-(void)getAllTheBooks{
NSMutableArray *bookList =[[NSMutableArray alloc]init];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:@"https://natasha....../items" parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
NSArray *bookCollectionArray = (NSArray*)responseObject;
for (NSDictionary *dict in bookCollectionArray) {
individualBook = [[Book alloc]init];
individualBook.bookID = [dict objectForKey:@"id"];
individualBook.bookLink = [dict objectForKey:@"link"];
individualBook.bookTitle = [dict objectForKey:@"title"];
[bookList addObject:individualBook];
}
[self setBookList:bookList];
} failure:^(NSURLSessionTask *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
}
-(void)setBookList:(NSMutableArray*)list{
self.bookList = [[NSMutableArray alloc]init];
self.bookList = list;
}
-(NSMutableArray*)getBookList{
return self.bookList;
}
@end
我的控制器viewDidLoad
如下 -
- (void)viewDidLoad {
[super viewDidLoad];
DataProcessing *processing = [[DataProcessing alloc]init];
[processing getAllTheBooks];
NSMutableArray *array = [processing getBookList];
NSLog(@"%@", array);
}
当它崩溃时,会显示类似的内容 -
有人可以帮忙吗?
答案 0 :(得分:0)
嗯,我不是100%确定这会有效,但你可以尝试在init方法中初始化可变数组,然后只需要self.bookList = list;在setter方法中。
答案 1 :(得分:0)
不需要在bookList属性的setter方法中分配新的NSMutableArray,将其分配给bookList属性,然后将其设置为传入的列表。而不是访问bookList在访问者方法中使用self
的属性建议使用支持变量或 ivar (实例变量),前缀为下划线(例如_bookList
),称为直接访问。
您应该使用直接访问而不是self.bookList
的原因是因为self.bookList = [[NSMutableArray alloc] init]
已转换为[self setBookList:[[NSMutableArray alloc] init]];
,这意味着您的setter方法内部bookList
属性,您将再次调用setter方法并导致递归循环。例如,您现在拥有的代码将转换为以下内容:
-(void)setBookList:(NSMutableArray*)list{
[_bookList release];
[self setBookList:[[NSMutableArray alloc]init]];
[self setBookList:list];
[_bookList retain];
}
因此,在第二次调用setBookList:
时,您已经释放了bookList属性,这就是为什么您会收到EXC_BAD_ACCESS
错误的原因。如果您没有在setter方法中进行任何类型的验证或需要自定义代码,则无需定义它,因为将自动为您定义setter方法。但是,作为参考,下面是定义您的setter方法而不做任何修改的正确方法(符合上述和ARC):
- (void)setBookList:(NSMutableArray *)bookList
{
if (_bookList != bookList)
_bookList = bookList;
}