分配和弱

Assign And Weak

我想看看 assign 和 weak.So 我 运行 下面这段代码的区别:

@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

assignString = 0x0

weakString = 0x0

str = (null)

assignString = (null)

weakString = (null)

但我得到了这个输出:

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

str = 0x0

assignstr = 0x100002078

weakStr = 0x100002078

str = (null)

assignStr = i'm test string

weakString = i'm test string

我的代码有问题吗?

  1. 正如 CRD 所说,字符串有各种各样的优化来改变它们的内存管理。使用您自己的自定义 NSObject 子类重复此练习,您应该会看到传统的对象生命周期行为。

  2. 您对 assign 属性 的预期输出不正确。您应该期望它有一个指向已释放对象的悬空指针。释放对象时,assign 引用不会自动设置为 nilweak 引用会,但 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);

在第二个 NSLog 语句中,strongweak 引用将为 nil,但 assign 引用不会。