如何检查是否已设置NSArray

时间:2011-10-27 03:39:44

标签: objective-c ios cocoa

我有一个单例(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");

声明通过。我确定我在这里遗漏了一些东西。如何检查我的阵列是否已设置?

2 个答案:

答案 0 :(得分:2)

此处,array可能是未初始化的垃圾值:

NSArray *array;

在这里,您需要使用NSString,而不是c字符串:

NSLog ("%u", array.count);

但是你走的是正确的道路,因为你可以测试对象的nil,然后是它的计数。很多人只是写if (n < [array count]) ...之类的内容,因为在这种情况下,如果[array count]array0的结果将为0。

重新考虑如何初始化对象的状态(meh,singletons ......)并打开编译器警告。它还有助于添加一些健全性检查断言,以验证您的单例在外部使用时是否正确构建。

答案 1 :(得分:1)

count NSArray 的方法,而不是属性。

NSLog(@"%d", [array count]);

在访问索引2处的对象之前,检查数组的计数是否至少为3。

相关问题