【问题标题】:How to check if an NSArray has been set如何检查是否已设置 NSArray
【发布时间】:2011-10-27 13:40:49
【问题描述】:

我有一个单例 (StoreManager) 来帮助我管理我的应用内购买,它有一个名为 productArray 的属性,它的设置如下:

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    self.productArray = response.products;
}

在我商店的视图控制器中,我有以下代码:

-(void)setupPrices 
{
    if ([[StoreManager sharedStoreManager] productArray]) {
        [productArray objectAtIndex:2]...
}

它工作了一段时间,但现在我得到 SIGABRT: index 2 beyond bounds of empty array,所以很明显我的 if 语句已经通过了,即使设置值的方法还没有被调用。我觉得这很奇怪,所以我尝试了一些代码,看起来如果我这样做了

NSArray *array;
NSLog (@"%u", array.count);

我获得了错误的访问权限,如果我这样做了

NSArray *array;
if (array)
    NSLog(@"Array is not nil");

语句通过。我确定我在这里遗漏了一些东西。如何检查我的数组是否已设置?

【问题讨论】:

  • 观察编译器警告。 @"Array is not nil" 应该使用而不是"Array is not nil"。

标签: objective-c ios cocoa


【解决方案1】:

这里,array 可能是一个未初始化的垃圾值:

NSArray *array;

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

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

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

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

【讨论】:

【解决方案2】:

countNSArray 的方法,而不是属性。

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

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

【讨论】:

  • +1,我以前在java上工作时讨厌NullPointerException,但现在拥有它似乎很好!因为 Objective C 在它为 nil 的时候非常安静。
  • 点语法和声明的属性是正交的。
猜你喜欢
  • 2020-03-12
  • 2014-06-15
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多