访问两个视图控制器之间传递的属性时的EXC_BAD_ACCESS

时间:2013-10-27 21:37:45

标签: ios iphone objective-c memory-management ios7

我有两个与segue连接的视图控制器(我将称之为视图控制器1和视图控制器2),其中我使用准备将一个名为Lead的实体从视图控制器1传递到视图控制器2。我使用相同的机制将相同的引导传递给其他视图控制器,我也使用来自其他视图控制器的视图控制器2并且工作正常。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    UIViewController *destinationVC = segue.destinationViewController;
    if([destinationVC isKindOfClass:[UINavigationController class]])
        destinationVC = ((UINavigationController *)destinationVC).topViewController;

    if([destinationVC respondsToSelector:@selector(setLead:)]) {
        [destinationVC performSelectorOnMainThread:@selector(setLead:) withObject:self.lead waitUntilDone:YES];
    }

然而在这种特殊情况下,当从视图控制器2开始,我尝试从任何地方访问此引导属性(在这种情况下,首先在viewDidLoad中访问,我在控制台中获得EXC_BAD_ACCESS代码= 1和(lldb)而没有其他再一次,我在这个视图控制器2中使用与其他视图控制器相同的代码,它也在这里传递了Lead实体并且工作正常。

if([self.lead.category isEqualToNumber:@(Buyer)])
    outputImage = [BackgroundGradient blueGradientWithRect:self.tableView.bounds];

接下来我做的是创建一个新属性...只需将属性声明从lead复制并粘贴到lead2并将数据传递给那个...而是它工作了,我正在查看控制器2没有崩溃,并且能够看到和更改数据没有问题,但是当我回击以返回查看控制器1时,我在视图控制器2的@implementation行上获得另一个EXC_BAD_ACCESS,其中包含.ccx_destruct消息并冻结了应用程序。

我不知道发生了什么,现在让我疯了。我尝试过使用NSZombieEnabled和乐器,但没有运气。任何帮助将不胜感激!我已经和这个问题争斗了两天了。我正在使用在Mavericks上运行Xcode 5的iPhone 5s上进行iOS7调试。我正在使用带有ARC的Storyboard来实现一个也应该部署到iOS6的项目。

谢谢!

2 个答案:

答案 0 :(得分:0)

似乎你有一个shallow copy属性'lead'导致崩溃。制作一份深层副本并将其传递给Viewcontroller 2.

设置

  

@property(非原子,复制)LeadObject * lead;

为您实现了LeadObject的copyWithZone。确保其子属性也被复制。也就是说,它的子属性也应该有copyWithZone以便进行深层复制如果保留了Lead并不意味着它的所有子属性都被保留。

//编辑:使用ARC并不等同于GC。您必须引导ARC并指示您希望保留对象的时间。您的对象在访问之前会自动释放,并且在手机和模拟器上的时间会有所不同。

答案 1 :(得分:0)

自己解决了!事实证明,在这样的情况下,最好是产品>分析并修复标记的所有内容,包括警告!

事实证明我在视图控制器2中使用了一个具有特定名称的字段 - 显然iOS7 SDK添加了我在SDK中使用的这个字段名称,我在没有实际知道的情况下覆盖它 - 所以谁知道我在做什么。无论如何,重命名和现场和问题解决了。花了我2天才到达那里:)