2016-01-11 35 views
0

我正在使用Afnetworking版本3.0並嘗試加載一些數據。數據正確進入響應對象,我試圖在NSMutableArray中解析。然而,這是崩潰給我錯誤 -應用程序崩潰日誌「警告:無法加載任何Objective-C類信息。」

「警告:無法加載任何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

任何人都可以請幫助?

回答

0

嗯,我不是100%肯定這會工作,但你可以嘗試在init方法中初始化可變數組,然後只需要self.bookList = list;在setter方法中。

+0

Nop ...同樣的錯誤。 – Natasha

+0

好吧,無論如何不需要重新初始化將不斷調用的方法內部的bookList屬性。這隻需要在類初始化的地方進行一次。 – Echizzle

0

沒有必要在bookList屬性的setter方法內部分配一個新的NSMutableArray,將其分配給bookList屬性,然後將其設置爲傳入的列表。而不是使用訪問器內的self訪問bookList屬性方法,建議使用支持可變的ivar(實例變量)來代替,這是由一個下劃線前綴(例如_bookList)和已知爲直接訪問

你應該使用直接訪問代替self.bookList的原因是因爲self.bookList = [[NSMutableArray alloc] init]轉換爲[self setBookList:[[NSMutableArray alloc] init]];,這意味着對於bookList屬性的setter方法裏面,你會被再次調用setter方法,並導致遞歸循環。例如,你的代碼必須以現在將轉化爲類似如下:

-(void)setBookList:(NSMutableArray*)list{ 
    [_bookList release]; 
    [self setBookList:[[NSMutableArray alloc]init]]; 
    [self setBookList:list]; 
    [_bookList retain]; 
} 

因此,在第二次調用setBookList:,你要釋放書目屬性,您已經發布後, ,這就是爲什麼你會收到EXC_BAD_ACCESS錯誤。如果你沒有進行任何類型的驗證,或者需要setter方法中的自定義代碼,則不必定義它,因爲setter方法將自動爲您定義。但是,以下是適當的方式來定義您的設置方法沒有任何修改(符合上述和ARC):

- (void)setBookList:(NSMutableArray *)bookList 
{ 
    if (_bookList != bookList) 
     _bookList = bookList; 
} 
相關問題