EXC_BAD_ACCESS(代码= 1),但仅在设备上,因为使用IOS7.1b4升级到Xcode 5.1b4

时间:2014-01-25 17:12:30

标签: ios xcode

我自己编写了一个分段控件(UISegmenterControl),一旦选定的段发生了变化,它就会发送一条消息:

- (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex
{
    if(_selectedSegmentIndex != selectedSegmentIndex) {
        NSInteger segmentIndex = 0;

        for (UISegmenterControlSegment *segmentButton in self.segmentButtons) {
            if (segmentIndex == selectedSegmentIndex) {
                [segmentButton setSelected:YES];

                _selectedSegmentIndex = selectedSegmentIndex;

                if (self.target != nil) {
                    if ([self.target respondsToSelector:self.action]) {
                        objc_msgSend(self.target, self.action, self);
                    }
                }
            }
            else {
                [segmentButton setSelected:NO];
            }

            segmentIndex++;
        }
    }
}

objc_msgSend在我的视图控制器中触发offChangeSegmentControl:(UISegmenterControl *)控件,同时将指针传递给分段控件本身。

问题是,自从升级到XCode 5.1 beta 4和我的开发设备升级到IOS 7.1 beta 4后,当didChangeSegmentControl触发时,我的代码在EXC_BAD_ACCESS(代码= 1)的设备上失效。

似乎在objc_msgSend和didChangeSegmentControl之间丢失了指向分段控件的指针(即'control'参数)。

最令我困惑的是,直到我升级后才发生这种情况,但在分析应用程序时,模拟器或设备上仍然没有发生这种情况。我想我的问题是:这看起来是我的代码的问题(在以前的IOS和/或XCode上以某种方式完全正常运行)或者这可能是最新测试版的问题?

如果您需要有关我的应用的更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:2)

不是使用objc_msgSend,而是使用以下内容:

[self.target performSelectorOnMainThread:self.action withObject:self waitUntilDone:YES];

P.S。感谢您对评论中正确对象的更新