2

今天,我将我的 Xcode 升级到最新版本(版本 5.1 (5B130a))以支持 iOS 7.1。完成此操作后,我像往常一样在 Xcode 中运行我的项目。然后应用程序崩溃。在升级 SDK 版本之前我没有更改任何代码。该代码在 iOS 5.x、6.x、7.0.x 中完美运行。

我只是在当前视图控制器中呈现另一个视图控制器。它们都由故事板初始化。在处理 presentViewController 方法时,它收到一条错误消息“线程 1:EXC_BAD_ACCESS (code=2, address=0x60)”。我检查了变量,它们都还活着,而不是释放的垃圾。iOS 7.1有什么问题?

该项目正在使用非ARC机制。这是我的代码:

@property (nonatomic, retain) ArticleViewController *articleView;
....

self.articleView = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"ArticleViewController"];
...

[self presentViewController:self.articleView animated:NO completion:^() {
    log(@"has shown article page...");
}];

但如果使用 addSubView 函数呈现另一个视图,它工作正常:

[self.view addSubView:self.articleView.view];

我真的不知道为什么会这样。

4

4 回答 4

3

这发生在我的应用程序中,同时展示了一个视图控制器modalPresentationStyle = UIModalPresentationCustom;

这是我的代码在 iOS 7.0 上的样子:

//Inside my MyPresentedViewController:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        [self setupContent];
    }
    return self;
}

- (void)setupContent
{
    //TransitionManager adopts UIViewControllerTransitioningDelegate and UIViewControllerAnimatedTransitioning
    TransitionManager *transitionManager = [[TransitionManager alloc] init];
    transitionManager.presenting = YES;

    self.modalPresentationStyle = UIModalPresentationCustom;
    self.transitioningDelegate = transitionManager;
}

但是,上面的代码在 iOS 7.1 上崩溃了,所以我将实现更改为:

@interface MyPresentedViewController

@property (nonatomic, strong) TransitionManager *transitionManager;

@end

...

//Inside my MyPresentedViewController:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        [self setupContent];
    }
    return self;
}

- (void)setupContent
{
    //TransitionManager adopts UIViewControllerTransitioningDelegate and UIViewControllerAnimatedTransitioning
    self.transitionManager = [[TransitionManager alloc] init];
    _transitionManager.presenting = YES;

    self.modalPresentationStyle = UIModalPresentationCustom;
    self.transitioningDelegate = _transitionManager;
}

基本上,我没有transitionManager在方法中声明一个对象,而是setupContent为它创建了一个私有属性(强引用)。

于 2014-03-24T08:50:35.080 回答
0

这可能与所述问题或答案完全无关,但我在 iPhone 5S 上访问 NSString 时遇到了类似问题。完全相同的代码同时在 iPad 和 iPad 上运行良好。

首先,我认为声明我在 ARC 下运行很重要,并且我被反复告知不要“释放”我在函数中实例化的任何对象。我之前遇到过这个问题,所以我使用我的一些 C# 背景将几乎所有的局部变量设置为 nil(在 C# 中为 null)。是的,我也不相信 MS GC。

回到手头的问题;我有一个名为“数据”的 NSString。'data' 是从不同类中的另一个方法读取的结果。使用 NSLog 我可以看到“数据”的内容。在下一行中,我将“数据”转换为数组以在 scanf 中使用它。那仍然有效。在第三行,我再次尝试 NSLog 'data',但随后出现 EXC_BAD_ACCESS 错误。每次都有不同的地址。与使用 Microsoft 垃圾收集器相比,我对 ARC 的使用更加不自在,因此我将函数包装在 try..catch..finally 中。“数据”现在位于 try..catch..finally 之外。最后我将“数据”设置为零,这似乎解决了这个问题。

我知道这有点啰嗦,但我真的很感激有人能解释为什么会发生这种情况。我希望现在我的代码中会出现很多这样的问题。

于 2014-03-28T10:14:24.260 回答
0

嗯,我唯一能想到的就是确保您的 articleView 属性是一个强引用。

@property (nonatomic, strong) ArticleViewController *articleView;
于 2014-03-13T05:23:39.927 回答
0

我在选择器视图中遇到了类似的问题。就我而言,在选择处理程序块之后,pickerview 被设置为 nil,尽管这在昨晚没有引起任何问题,但它导致应用程序在今天早上崩溃。删除该行解决了这个问题,但是我在上个月将此项目转换为 ARC,因此您可能必须找到更好的方法来处理清理工作。

于 2014-03-14T18:29:48.273 回答