objective-c - EXC_BAD_INSTRUCTION 当合成@property(弱)IBOutlet NSWindow *window

标签 objective-c automatic-ref-counting weak-references iboutlet

总的来说,我是 ObjC/Cocoa 和 Mac 开发的新手,并且在玩弄基础知识。

Lion 上 Xcode 4.2 中新 Cocoa 应用程序的简单默认模板如下所示:

// AppDelegate.h
#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;

@end



// Appdelegate.m
#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
}

@end

我一直以此为基础进行各种实验。阅读自动引用计数(项目将使用)— this article ,例如——我假设可以,甚至可能应该weak 替换 NSWindow *windowassign 限定符>,但似乎并非如此。

应用构建良好,但在启动过程中挂起,Thread 1: Program received signal: "EXC_BAD_INSTRUCTION" in AppDelegate.m on the line with @合成窗口 = _window;.

将限定符更改为 strong 可以使程序运行,但我看不出从 assignstrong 有什么意义.我的印象是非 ARC/ARC 的配对是分配/弱和保留/强。

一位更有经验的程序员 friend 建议,即使 weak 限定符导致 window 被过早地释放并且一些对其的访问尝试失败,异常也应该是 EXC_BAD_ACCESS,而不是 EXC_BAD_INSTRUCTION

我显然在这里遗漏了一些东西,但我不知道是什么。

编辑: 在仔细查看崩溃时 gdb 输出后,同一位 friend 向我指出了 this article by Mike Ash这说明了这一点。由于我无法理解的原因, NSWindow 和其他一些覆盖了 retainrelease 的类不能成为归零弱引用的目标。有趣的是,将属性声明更改为此有效:

@property (unsafe_unretained) IBOutlet NSWindow *window;

...即使 unsafe_unretained 没有在 Apple's documentation for Declared Properties 中提及.

有了这个,一个修改后的问题:

去这里的正确方法是什么?坚持 assign 尽管网络上提到它不应该与 ARC 一起使用?选择 strong?继续使用 unsafe_unretained 因为它似乎有效?还有别的吗?

最佳答案

从概念上讲,“弱”是 OS X 上顶级 IBOutlet 的正确限定词(iOS 是另一回事)。然而,要创建一个在释放时归零的适当的弱引用,需要 Objective C 运行时的合作。覆盖 retain 或 release 的类会破坏这种支持,因此您无法创建对它们的弱引用。 UIWindow 就是这样一个类。

这就是模板使用“分配”的原因。如果启用了 ARC,也许它真的应该使用同义词“unsafe_unretained”。在任何一种情况下,您都有一个未归零的简单弱引用。

关于objective-c - EXC_BAD_INSTRUCTION 当合成@property(弱)IBOutlet NSWindow *window,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7905832/

相关文章:

ios - @autoreleasepool 似乎没有耗尽池

objective-c - 为什么在构造函数中释放会导致EXC_BAD_ACCESS?

ios - ios界面元素的强弱修饰符

objective-c - UITableViewCell accessoryType位置随单元格高度变化

iphone - ios找出引发事件的按钮

objective-c - 开始工作表 : block alternative with ARC?

java - 为什么我的处理程序引用空 Activity ?

objective-c - Objective C 中的实例缓存

iphone - 导航栏和 View 之间的分隔符 - iOS 7

像 QuizUp 一样打开控制中心时通知 iOS