应用程序崩溃日志记录"警告:无法加载任何Objective-C类信息。"

时间:2016-01-11 22:45:15

标签: ios objective-c afnetworking block

我正在使用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);
}

当它崩溃时,会显示类似的内容 -

enter image description here

有人可以帮忙吗?

2 个答案:

答案 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;
}