分配和弱
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
我的代码有问题吗?
正如 CRD 所说,字符串有各种各样的优化来改变它们的内存管理。使用您自己的自定义 NSObject
子类重复此练习,您应该会看到传统的对象生命周期行为。
您对 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
语句中,strong
和 weak
引用将为 nil
,但 assign
引用不会。
我想看看 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
我的代码有问题吗?
正如 CRD 所说,字符串有各种各样的优化来改变它们的内存管理。使用您自己的自定义
NSObject
子类重复此练习,您应该会看到传统的对象生命周期行为。您对
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
语句中,strong
和 weak
引用将为 nil
,但 assign
引用不会。