例如,如果我们有 2 个具有 NSString 属性的对象,一个是弱的,一个是强的,像这样
@interface Class1 : NSObject
@property (weak) NSString *weakString;
@end
@interface Class2 : NSObject
@property (strong) NSString *strongString;
@end
然后这样做:
NSString *string = [[NSString alloc] initWithString:@"bla"];
Class2 *c2 = [[Class2 alloc] init];
c2.strongString = string;
string = nil;
Class1 *c1 = [[Class1 alloc] init];
c1.weakString = c2.strongString;
c2.strongString = nil;
甚至
c2 = nil;
然后 c1.weakString 包含什么?
将字符串分配给 strongString 调用字符串上的保留,将字符串分配给 nil 将第一个版本发送给字符串,将 strongString 分配给 weakString 不会更改保留计数,然后将 nil 分配给 strongString 将第二个版本发送给字符串,甚至将 nil 分配给c2,因此释放 c2 应该将第二个释放发送到字符串,所以现在weakString(以及字符串)的retainCount 应该为零,然后如果我们尝试访问它,那么如果我们尝试访问它,那么weakString 将归零并为零
但是'weakString'仍然包含“bla”所以原始字符串对象,为什么?