2

unsafe_unretainedweakキーワードについては疑問があります。読み取りとしてはまったく同じであり、唯一の違いは、指定されたオブジェクトが解放された場合に弱いキーワードが 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 ビュー]

ここに画像の説明を入力

4

1 に答える 1

2

私は答えを見つけました:代理人のための弱い財産で述べたように形成することはできません

現在、次のクラスのインスタンスへのゼロ化弱参照を作成することはできません(強調鉱山):

NSATSTypesetter、NSColorSpace、NSFont、NSFontManager、NSFontPanel、NSImage、NSMenuView、NSParagraphStyle、NSSimpleHorizo​​ntalTypesetter、NSTableCellView、NSTextView、NSViewController、NSWindow、およびNSWindowController。さらに、OS Xでは、AVFoundationフレームワークのクラスは弱参照をサポートしていません。

宣言されたプロパティには、weakではなくassignを使用する必要があります。変数については、__weakの代わりに__unsafe_unretainedを使用する必要があります。

さらに、ARCでNSHashTable、NSMapTable、またはNSPointerArrayのインスタンスから弱参照を作成することはできません。

于 2012-12-12T19:05:02.530 に答える