0

私はObjective Cの初心者です。私がやっていることは、目的のView ControllerのprepareSegueにいくつかの値を設定することです。奇妙なことに、関数で NSLog をコメントアウトすると、宛先コントローラーのプロパティに値が割り当てられません。

私のコードは次のとおりです。

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

   if ([segue.identifier isEqualToString:@"ShowItemOnMap"] ) {
       LocateItemViewController *lic = [segue destinationViewController];
       NSIndexPath *index = [self.tableView indexPathForSelectedRow];

       // self.itemsToBuy is a array of NSDictionary
       NSDictionary *selectedItem = [self.itemsToBuy objectAtIndex:[index row]];
       Item *theItem = [[Item alloc] init];
       NSString *theTitle = [[NSString alloc] initWithString:[selectedItem valueForKey:@"title"]];
       theItem.title = theTitle;
       lic.item = theItem;

       // commenting out NSLog make self.irem in LocateItemViewController nil
       // and no value is shown at screen
       NSLog(@"%@", lic.item.title);
   }

}

項目はプロパティを持つカスタム クラスです

@property (strong, nonatomic) NSString *title;

LocateItemController には次のプロパティがあります

@property (weak, nonatomic) Item *item;
@property (strong, nonatomic) IBOutlet UILabel *titleLabel;

そしてviewDidLoadは単にアイテムを割り当てます

self.titleLabel.text = self.item.title;
4

2 に答える 2

2

アイテムを保持する必要がある場合は、それを強力なプロパティにする必要があります。

于 2012-12-04T15:46:08.533 に答える
0

アダムは正しいです。item プロパティは強力である必要があります。そうしないと、投稿したコードの実行が終了するとすぐに解放されます。

Item オブジェクトの "title" プロパティをまだ強化していない場合は、強化する必要もあります。

オブジェクトの所有権について調べる必要があります。

取引はこれです: システムは、オブジェクトへの強い参照を持つオブジェクトの数を追跡します。そのカウントがゼロになると、オブジェクトは解放されます。

ローカル変数はデフォルトで強力です。「theItem」ローカル変数を作成すると、それは強力で、prepareForSegue メソッドのスコープ内にのみ存在します。そのメソッドが終了すると、変数 theItem は範囲外になり、Item オブジェクトへの強い参照はなくなります。

LocateItemController の item プロパティを弱くしました。つまり、 LocateItemController は、アイテム プロパティに割り当てられたアイテム オブジェクトの所有権を取得しません。

LocateItemController の item プロパティ宣言を strong に変更すると、Item オブジェクトをそのプロパティに割り当てると、LocateItemController が Item の所有権を取得します。

最後に、LocateItemController の dealloc メソッドで、次の行を追加する必要があります。

self.item = nil;

これにより、LocateItemController が解放される直前に LocateItemController の item オブジェクトが解放されます。

于 2012-12-04T16:10:59.753 に答える