たとえば、NSString プロパティを持つ 2 つのオブジェクトがある場合、このように 1 つは弱いもので、もう 1 つは強いものです。
@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 に代入されて 2 番目のリリースが文字列に送信されるか、または nil が文字列に代入されます。したがって、c2 をリリースすると、2 番目のリリースが文字列に送信され、weakString (および文字列) の保持カウントがゼロになり、次にリリースされるため、weakString にアクセスしようとすると nil がゼロになります。
しかし、「weakString」にはまだ「bla」が含まれているため、元の文字列オブジェクトはなぜですか?