我需要一些帮助。
我正在开发的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 :(得分:0)
您需要确定哪一行代码会导致错误访问。是sharedInstance
方法还是ratingFromObjectName:
。我首先将调用代码更改为
ItemManager *manager = [ItemManager sharedInstance];
int rating = [manager ratingFromObjectName:bla];
因为这有助于隔离问题。
其次,我还会考虑不使用Singleton模式,除非真的有必要是iOS应用程序。根据我的经验,它经常被过度使用(在Java世界中),虽然方便,但可以使写单元测试更复杂。