0

我的 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];

请任何人都可以帮助指出我哪里出错了?这是使用一组滑块或任何控件的正确方法吗?我想遍历它们,最好是用字典,这样我就可以用字符串键引用它们,但我会满足于简单的数组。

4

3 回答 3

3

代替

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

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

通过直接访问 ivar,您绕过了属性的内存管理,因此您的数组在设置后被释放。然后您会发生崩溃,因为您正在向已发布的对象发送消息。

于 2012-05-01T13:29:33.900 回答
1

你可以替换:

   id obj = [sliders objectAtIndex:0];

  UISlider *obj = [sliders objectAtIndex:0];

也尝试打电话

  self.sliders //instead of just sliders

看看它是否仍然崩溃,如果数组非零,也尝试做一个条件......你连接了插座吗?你是过度释放还是释放不足 你在 ARC 上吗?

重要问题...

于 2012-05-01T13:26:17.997 回答
0

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

  • 在使用 NSLOG 使用 objectAtIndex 之前,您可以在行中显示数组吗
  • 您是否使用属性分配给滑块(self.sliders),如果没有,您最终可能会访问已释放的数组。
  • 如果您没有使用 ARC,您是否尝试过使用 NSZombies 来跟踪问题?
于 2012-05-01T13:28:10.750 回答