使用Singleton时访问错误代码1

时间:2014-01-07 21:32:41

标签: objective-c singleton exc-bad-access

我需要一些帮助。

我正在开发的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

1 个答案:

答案 0 :(得分:0)

您需要确定哪一行代码会导致错误访问。是sharedInstance方法还是ratingFromObjectName:。我首先将调用代码更改为

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

因为这有助于隔离问题。

其次,我还会考虑不使用Singleton模式,除非真的有必要是iOS应用程序。根据我的经验,它经常被过度使用(在Java世界中),虽然方便,但可以使写单元测试更复杂。