iOS用のBigNerdRanch(第3版)を使用しています。そして、私はARCメモリ管理の章にいます。保持サイクルを説明しようとしており、次のように短いコンソールアプリケーションを変更します。
BNRItemのヘッダー:
@interface BNRItem : NSObject
{
NSString *itemName;
NSString *serialNumber;
int valueInDollars;
NSDate *dateCreated;
BNRItem *containedItem;
BNRItem *container;
}
+ (id)randomItem;
- (void)setItemName:(NSString *)str;
- (NSString *)itemName;
- (void)setSerialNumber:(NSString *)str;
- (NSString *)serialNumber;
- (void)setValueInDollars:(int) i;
- (int)valueInDollars;
- (void)setContainedItem:(BNRItem *)i;
- (BNRItem *)containedItem;
-(void)setContainer:(BNRItem *)i;
- (BNRItem *)container;
- (NSDate *)dateCreated;
- (id)initWithItemName:(NSString*)name valueInDollars:(int)value serialNumber:(NSString *)sNumber;
- (id)initWithItemName:(NSString *)name andSerialNumber:(NSString *)sNumber;
@end
メインファイル:
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSMutableArray *items = [[NSMutableArray alloc]init];
BNRItem *backpack = [[BNRItem alloc] init];
[backpack setItemName:@"Backpack"];
[items addObject:backpack];
BNRItem *calculator = [[BNRItem alloc]init];
[calculator setItemName:@"Calculator"];
[items addObject:calculator];
[backpack setContainer:calculator];
NSLog(@"Setting items to nil");
items = nil;
}
return 0;
}
この後、「これまでのメモリ管理の理解によれば、アイテムがnilに設定されている場合、両方のBNRItemがインスタンス変数とともに破棄される必要があります」と書かれています。これ以前は、BNRItemが破棄されたときに出力するためにdeallocをオーバーライド(void)する必要がありました。
だから私はそれを実行し、バックパックは電卓への強い参照を持っているので、どちらも破壊されないので、私は見ると思います。コンソールでは、両方が破棄されているのがわかりますが、アプリケーションの終了時に両方が破棄されているためだと思います。アイテムをゼロに設定した後にブレークポイントを実行すると、何も破壊されません。それは本が起こるべきだと言っていることです...しかしそれは私にコンテナを設定させます
__weak BNRItem *container
そして、私がそれを実行しても、それでも何も破壊されません。nilに設定しなかったというポインタがまだあるので、私は推測していますか?この本はこの時点でそうすることについて言及していませんが。だから私は本の説明を理解しています(私は思います)が、実際にはそれは起こっていません。