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 = (null)

分配字符串 = (null)

弱字符串 = (null)

但我得到这个输出:

2015-06-17 11:22:04.676 分配弱差异[4696:1897735]

str = 0x0

分配str = 0x100002078

弱Str = 0x100002078

str = (null)

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);

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

于 2015-06-17T04:55:27.313 回答