2014-01-07 6 views
0

Мне нужна помощь.Код плохого доступа 1 при использовании Singleton

Я использую этот одноплодный шаблон внутри приложения IOS я разрабатываю:

.h файл

#import <Foundation/Foundation.h> 

@class Item; 

@interface ItemManager : NSObject 

- (id)init; 
+ (ItemManager *)sharedInstance; 

- (int)ratingFromObjectName:(NSString *)objectName; 

@property(nonatomic,strong) NSArray *itemArray; 

@end 

.m файл

static ItemManager *sharedInstance = nil; 

+ (ItemManager *)sharedInstance 
{ 

static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    sharedInstance = [[ItemManager alloc] init]; 

}); 
return sharedInstance; 
    } 

    - (int)ratingFromObjectName:(NSString *)objectName { 

for (int i = 0; i < itemArray.count; i++) { 
    if ([[[itemArray objectAtIndex:i] itemName] isEqualToString:objectName]) { //This is the line that throws bad access code 1 
     NSLog(@"Found: %@ Returned: %d", [[itemArray objectAtIndex:i] ratingAverage], 
       [[[itemArray objectAtIndex:i] ratingAverage] intValue]); 

     return [[[itemArray objectAtIndex:i] ratingAverage] intValue]; 
    } 
} 
return 0; 
    } 

Я получаю плохой доступ, когда я используйте это в другом классе:

int rating = [[ItemManager sharedInstance] ratingFromObjectName:bla]; 

Объект bla, который отправляется, является NSString, который определенно работает, это 100% не проблема, поскольку я тестировал это. Удаление метода sharedInstance и создание массива каждый раз, кажется, работает, однако моя попытка для этого синглтона заключается в том, чтобы избежать этого, любые предложения были бы весьма признательны.

Обратите внимание, что я прокомментировал строку, возвращающую ошибку.

С уважением, WA

+0

Какой объект "bla'"? Кроме того, вы получаете правильные значения из вашего «NSLog», напечатанного на консоли? –

+0

Bla - это строка, она работает правильно, если я продолжаю создавать экземпляр ItemManager, но это не то, что я хочу, мне нужен синглтон, поэтому он на init один раз. – user3131312

+0

Почему вам даже нужен синглтон ?, похоже, что это может быть достигнуто с помощью метода класса. –

ответ

0

Вы должны работать, какие строки кода бросает плохой доступ. Это метод sharedInstance или ratingFromObjectName:. Я бы сначала изменил код вызова на

ItemManager *manager = [ItemManager sharedInstance]; 
int rating = [manager ratingFromObjectName:bla]; 

Как это поможет с изолированием проблемы.

Во-вторых, я бы также подумал о том, чтобы не использовать шаблон Singleton, если действительно не нужны приложения для iOS. По моему опыту, его часто злоупотребляют (и в мире Java), и, в то же время, удобные, могут затруднить выполнение тестовых тестов.

+0

Спасибо, но для разработки приложения, которое я разрабатываю, потребуется один сингл. Как показано в исходном сообщении; Я выделил строку, приводящую к ошибке комментария. – user3131312

Смежные вопросы