0

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に設定しなかったというポインタがまだあるので、私は推測していますか?この本はこの時点でそうすることについて言及していませんが。だから私は本の説明を理解しています(私は思います)が、実際にはそれは起こっていません。

4

1 に答える 1

1

オートコンプリートを信頼しました。

[backpack setContainer:calculator]

になるはずだった

[backpack setContainedItem:calculator]
于 2012-10-06T22:58:11.767 に答える