访问viewDidLoad期间访问的数组时出错

时间:2012-05-01 13:21:54

标签: objective-c nsarray

我的xib文件中有一堆滑块,我在我的头文件中引用如下:

@property (nonatomic, retain) IBOutlet UISlider *slider1;
@property (nonatomic, retain) IBOutlet UISlider *slider2;
@property (nonatomic, retain) IBOutlet UISlider *slider3;

然后我在头文件中声明我的NSArray:

@property (nonatomic, retain) NSArray *sliders;

现在在我的实现中,我在viewDidLoad处理程序

期间使用滑块填充数组
sliders = [NSArray arrayWithObjects:slider1, slider2, slider3, nil];

当然,这些属性已经合成。 到目前为止一切运作良好。使用断点,我可以看到数组已正确填充,我使用NSLog获得滑块值。

问题是当我处理按钮提交事件时,该数组似乎是空的 此行生成执行中止错误:

id obj = [sliders objectAtIndex:0];

请任何人帮忙指出我哪里出错了?这是使用滑块集合或任何控件的正确方法吗?我想迭代它们,理想情况下使用字典,以便我可以用字符串键来引用它们,但我会选择简单的数组。

3 个答案:

答案 0 :(得分:3)

替换

sliders = [NSArray arrayWithObjects:slider1, slider2, slider3, nil]; 

使用

self.sliders = [NSArray arrayWithObjects:slider1, slider2, slider3, nil]; 

通过直接访问ivar,您将绕过属性的内存管理,因此您的阵列在设置后即被释放。然后,您会收到崩溃,因为您正在发布已发布的对象。

答案 1 :(得分:1)

你可以替换:

   id obj = [sliders objectAtIndex:0];

  UISlider *obj = [sliders objectAtIndex:0];

也尝试拨打

  self.sliders //instead of just sliders

并查看它是否仍然崩溃 如果数组非零,也会尝试创建一个条件... 你有连接插座吗? 你是在过度还是在释放 你在ARC吗?

重要问题......

答案 2 :(得分:0)

如果没有看到代码就很难猜到,但我会寻找以下内容:

  • 可以在使用NSLOG
  • 使用objectAtIndex之前在行中显示数组
  • 您是否正在使用属性分配给滑块(self.sliders),否则您最终可能会访问取消分配的数组。
  • 如果您不使用ARC,是否尝试过使用NSZombies来跟踪问题?