我有一个单例(StoreManager)来帮助我管理我的应用程序内购买,它有一个名为productArray的属性,其设置如下:
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
self.productArray = response.products;
}
在我商店的视图控制器中,我有以下代码:
-(void)setupPrices
{
if ([[StoreManager sharedStoreManager] productArray]) {
[productArray objectAtIndex:2]...
}
它工作正常一段时间,但现在我得到SIGABRT:索引2超出空数组的边界,所以很明显我的if语句已经传递为true,即使设置值的方法尚未被调用。我觉得这很奇怪所以我尝试了一些代码,似乎我做了
NSArray *array;
NSLog (@"%u", array.count);
我的访问权限很差,如果我这样做了
NSArray *array;
if (array)
NSLog(@"Array is not nil");
声明通过。我确定我在这里遗漏了一些东西。如何检查我的阵列是否已设置?
答案 0 :(得分:2)
此处,array
可能是未初始化的垃圾值:
NSArray *array;
在这里,您需要使用NSString,而不是c字符串:
NSLog ("%u", array.count);
但是你走的是正确的道路,因为你可以测试对象的nil,然后是它的计数。很多人只是写if (n < [array count]) ...
之类的内容,因为在这种情况下,如果[array count]
为array
,0
的结果将为0。
重新考虑如何初始化对象的状态(meh,singletons ......)并打开编译器警告。它还有助于添加一些健全性检查断言,以验证您的单例在外部使用时是否正确构建。
答案 1 :(得分:1)
count 是 NSArray 的方法,而不是属性。
NSLog(@"%d", [array count]);
在访问索引2处的对象之前,检查数组的计数是否至少为3。