0

クラス ClassA があると仮定しましょう

ヘッダ:

@interface ClassA : NSObject
- (id)initWithDelegate:(id)delegate;
@end

実装:

@interface ClassA ()
{
    NSObject *_delegate;
}
@end

@implementation
- (id)initWithDelegate:(id)delegate
{
    self = [super init];
    if( self )
    {
        _delegate = delegate;
    }

    return self;
}
@end

@property 定義をスキップしたので、デリゲート宣言のデフォルトは強いですか? リークが発生するため、このコードは間違っていますか、それともデリゲート宣言がデフォルトで弱いですか?

4

3 に答える 3

1

その ivar を __weak として修飾する必要があります。ivar のデフォルトは strong です。

そうしないと、ご存知のように、デリゲートで保持サイクルが発生する危険があります。

ところで、ここでの規則は NSObject * ではなく 'id' です。

于 2013-02-08T11:04:39.903 に答える
0

これを明示的にする方法でコードを書くのが最善です:

@interface ClassA : NSObject
@property(weak) id delegate; // or @property(weak, readonly)
@end

@implementation ClassA

- (id)initWithDelegate: (id) delegate
{
    self = [super init];
    _delegate = delegate;
    return self;
}

@end

デフォルトでは、インスタンス変数は強力です。

于 2013-02-08T11:03:48.120 に答える
0

あなたは正しいです。これにより、ARC は _delegate を保持します。つまり、「強い」参照を作成します。を宣言せずに弱参照を作成したい場合は@property、使用できます

@interface ClassA ()
{
    __weak id _delegate;
}
@end
于 2013-02-08T11:10:02.070 に答える