3

assign と weak の違いを調べたいので、以下のコードを実行します。

@interface Test : NSObject

@property(nonatomic, strong) NSString *str;
@property(nonatomic, assign) NSString *assignString;
@property(nonatomic, weak)   NSString *weakString;

@end

@implementation Test

- (id)init
{
    self =[super init];
    if (self)
    {
        self.str = @"i'm test string";
        
        self.assignString = self.str;
        self.weakString = self.str;

        self.str = nil;
        
        NSLog(@"dealloc \nstr = %p\n assignstr = %p\n weakStr = %p\n", self.str, self.assignString, self.weakString);

        NSLog(@"str = %@ \nassignStr = %@\n weakString = %@\n", self.str, self.assignString, self.weakString);
    }
    
    return self;
}

@end

次のように出力する必要があると思います。

str = 0x0

割り当て文字列 = 0x0

弱い文字列 = 0x0

str = (ヌル)

assignString = (ヌル)

weakString = (ヌル)

しかし、私はこの出力を得ます:

2015-06-17 11:22:04.676 AssignWeakDiff[4696:1897735]

str = 0x0

assignstr = 0x100002078

弱いStr = 0x100002078

str = (ヌル)

assignStr = 私はテスト文字列です

weakString = 私はテスト文字列です

私のコードに何か問題がありますか?

4

1 に答える 1

4
  1. CRD が述べたように、文字列にはメモリ管理を変更するあらゆる種類の最適化があります。NSObject独自のカスタムサブクラスでこの演習を繰り返すと、従来のオブジェクト ライフサイクルの動作が表示されるはずです。

  2. assignプロパティの予想される出力が正しくありません。割り当て解除されたオブジェクトへのダングリング ポインターがあることを期待する必要があります。オブジェクトの割り当てが解除されると、assign参照はnil自動的に設定されません。参照はweakしますが、assign参照はしません。

したがって、次のようなプロパティがある場合:

@property (nonatomic, strong) MyObject *strongObj;
@property (nonatomic, assign) MyObject *assignObj;
@property (nonatomic, weak)   MyObject *weakObj;

そして、次のようにします。

self.strongObj = [[MyObject alloc] init];
self.assignObj = self.strongObj;
self.weakObj   = self.strongObj;

NSLog(@"%@ %@ %@", self.strongObj, self.assignObj, self.weakObj);

self.strongObj = nil;

NSLog(@"%@ %@ %@", self.strongObj, self.assignObj, self.weakObj);

2 番目のNSLogステートメントでは、strongとのweak参照は になりますnilが、assign参照はそうではありません。

于 2015-06-17T04:55:27.313 に答える