unsafe_unretainedとweakキーワードについては疑問があります。読み取りとしてはまったく同じであり、唯一の違いは、指定されたオブジェクトが解放された場合に弱いキーワードが 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
そしてバックトレースは徹底的に _objc_trap <- objc_stroreWeak <- -[I4vMainView setDelegate:] <- [I4vViewController ビュー]