我对 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]
答案 0 :(得分:2)
我找到了答案:如weak property for delegate cannot be formed
中所述您目前无法创建对以下类的实例的归零弱引用(强调我的):
NSATSTypesetter,NSColorSpace,NSFont,NSFontManager,NSFontPanel,NSImage,NSMenuView,NSParagraphStyle,NSSimpleHorizontalTypesetter,NSTableCellView,NSTextView,NSViewController,NSWindow和NSWindowController。此外,在OS X中,AV Foundation框架中的任何类都不支持弱引用。
对于声明的属性,您应该使用assign而不是weak;对于变量,您应该使用__unsafe_unretained而不是__weak。
此外,您无法在ARC下从NSHashTable,NSMapTable或NSPointerArray的实例创建弱引用。