2

我有 2 个与 segue 连接的视图控制器(我将这些视图控制器称为视图控制器 1 和视图控制器 2),其中我使用 prepare 将名为 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 中访问,我在控制台中使用 (lldb) 获得 EXC_BAD_ACCESS 代码 = 1 并且没有任何其他帮助。同样,我在此视图控制器 2 中使用来自其他视图控制器的相同代码,它也在这里传递了 Lead 实体并且工作正常。

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

接下来我要做的是创建一个新属性...只需将属性声明从lead复制并粘贴到lead2,然后将数据传递给那个...这样就可以了,我可以在没有a的情况下查看控制器2崩溃并且能够查看和更改数据没问题,但是当我回击返回视图控制器 1 时,我在视图控制器 2 的 @implementation 行上得到另一个 EXC_BAD_ACCESS,在跟踪和应用程序中带有 .ccx_destruct 消息冻结。

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

谢谢!

4

2 回答 2

0

似乎您有一个导致崩溃的属性“铅”的浅表副本。制作一个深拷贝并将其传递给 Viewcontroller 2。

@property(nonatomic,copy)LeadObject *lead;

并为您的 LeadObject 实施 copyWithZone。确保它的子属性也被复制。即,它的子属性也应该具有 copyWithZone 以便进行深层复制。如果保留了 Lead,这并不意味着也保留了它的所有子属性。

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

于 2013-10-27T21:57:41.457 回答
0

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

原来我在视图控制器 2 中使用了一个具有特定名称的字段 - 显然 iOS7 SDK 添加了我作为 SDK 的一部分使用的这个字段名称,我在不知道的情况下覆盖了它 - 所以谁知道我实际上是在做。无论如何,重命名并解决了字段和问题。我花了 2 天到达那里:)

于 2013-10-28T00:36:40.320 回答