unsafe_unretained vs weak:在setDelegate期间崩溃

时间:2012-12-12 17:24:10

标签: objective-c cocoa

我对 unsafe_unretained 关键字有疑问:作为读取它们是完全相同的,唯一的区别是如果指向的对象被释放,则one设置为null。

现在我是下面的代码,它在 [instanceOfTheView setDelegate:self]

期间在[#2]点崩溃

但如果在I4vMainView声明中[#1]我替换

@property (nonatomic, weak) id <I4vDraggingFileProt> delegate;

@property (nonatomic, unsafe_unretained) id <I4vDraggingFileProt> delegate;

它完美无缺。这种行为的原因是什么?感谢

详细信息:目标10.7使用ARC进行编译。 Xcode 4.5.2。 Apple LLVM 4.1

在I4vMainView类我有:

//----------- I4vMainView.h --------
@protocol I4vDraggingFileProt <NSObject>
   -(void) anURLWasDeopped: (NSURL *) droppedUrl;
@end    

@interface I4vMainView : NSView <NSDraggingDestination>{
    NSImageCell *imageCell;
    NSImage * image;
}

@property (nonatomic, weak) id <I4vDraggingFileProt> delegate;  // [#1]

在来电者中

//----------- I4vViewController.h --------
@class I4vMainView;

@protocol I4vDraggingFileProt <NSObject>
    -(void) anURLWasDeopped: (NSURL *) droppedUrl;
@end

@interface I4vViewController : NSViewController <I4vDraggingFileProt>{
    I4vMainView * mv;
}

-(void) anURLWasDeopped: (NSURL *) droppedUrl;

@end


//----------- I4vViewController.m --------
@implementation I4vViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Initialization code here.
    }
    return self;
}

- (void)loadView{
    mv = [[I4vMainView alloc] init];
    [mv setDelegate:self];    // <-- [#2]
    [self setView:mv];       
}

-(void) anURLWasDeopped: (NSURL *) droppedUrl{
    // ...
}

@end

添加

委托声明为

@property (nonatomic, weak) id <I4vDraggingFileProt> delegate;

我有这个错误

<I4vMainView: 0x10060bf40> objc[4773]: cannot form weak reference to instance (0x10061bf10) of class I4vViewController

and back-trace彻底_objc_trap&lt; - objc_stroreWeak&lt; - - [I4vMainView setDelegate:]&lt; - [I4vViewController view]

enter image description here

1 个答案:

答案 0 :(得分:2)

我找到了答案:如weak property for delegate cannot be formed

中所述
  

您目前无法创建对以下类的实例的归零弱引用(强调我的):

     

NSATSTypesetter,NSColorSpace,NSFont,NSFontManager,NSFontPanel,NSImage,NSMenuView,NSParagraphStyle,NSSimpleHorizo​​ntalTypesetter,NSTableCellView,NSTextView,NSViewController,NSWindow和NSWindowController。此外,在OS X中,AV Foundation框架中的任何类都不支持弱引用。

     

对于声明的属性,您应该使用assign而不是weak;对于变量,您应该使用__unsafe_unretained而不是__weak。

     

此外,您无法在ARC下从NSHashTable,NSMapTable或NSPointerArray的实例创建弱引用。