1

ARCに関して少し誤解があります。次のコードを使用して、新しいUIViewControllerを作成しています。

    CGRect screenRect = [[UIScreen mainScreen] bounds];

    LocationProfileView *locationProfile = [[LocationProfileView alloc] initWithLocation:l];

    locationProfile.view.frame = CGRectMake(0, screenRect.size.height, screenRect.size.width, 400);
    [appDelegate.window addSubview:locationProfile.view];

    [UIView animateWithDuration:.25 animations:^{
      locationProfile.view.frame = CGRectMake(0, 0, screenRect.size.width, screenRect.size.height);
    }];

そのUIVIewに、画面からビューを削除するボタンを配置しました。これの問題は、locationProfile画面に追加された直後に割り当てが解除されるため、[閉じる]ボタン(LocationProfileViewクラスのメソッドを呼び出す)をタップしようとするたびに、アプリケーションがクラッシュすることです。

だから私はプロパティを追加しました:

@property(nonatomic, strong) LocationProfileView *locationProfile;

次のコードの2行目を変更しました。

locationProfile = [[LocationProfileView alloc] initWithLocation:l];

しかし、クラスを再度開始するまで、クラスの割り当てが解除されません(LocationProfileView?の最初のインスタンスへの参照が失われるため)。「閉じる」ボタンをタップするたびにクラスの割り当てを解除するにはどうすればよいですか?locationProfiletoの設定nilは機能すると思いますが、これは、メインクラス(コードブロックを含むメソッド)のメソッドを呼び出す必要があることを意味します。

これを行うための適切な方法は何ですか?私の質問があまりにもうるさい場合は申し訳ありません。

注: は、 'slに表示されるいくつかの情報を含むカスタムクラスのインスタンスです。LocationProfileViewUIVIew

4

2 に答える 2

2
- (void)closeButtonCallBack {
    [self.locationProfile removeFromSuperview];
    self.locationProfile = nil;
}

私はあなたの閉じるボタンのターゲットがビューコントローラー自体であると仮定しています

強力なポインタは、nilを割り当てない限り、viewController自体の割り当てが解除されるまでオブジェクトを保持します。

ローカル変数は、スコープ外になると割り当てが解除されます

代わりに

強力なポインタを使用せずに、これを行うことができます

LocationProfileView *locationProfile = [[LocationProfileView alloc] initWithLocation:l];

UIButton *close = [UIButton buttonWithType:UIButtonTypeRoundedRect];
close.frame = CGRectMake(0, 100, 100, 30);
[close addTarget:locationProfile action:@selector(removeFromSuperview) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:close];
于 2013-03-01T16:53:02.520 に答える
1

元の例では、

LocationProfile *locationProfile=...

ローカル変数です。したがって、コンストラクターから戻るとすぐにリリースされます。それはあなたが観察したものです。

強力なプロパティにすると、ViewControllerはlocationProfileを保持します。

 @property(nonatomic, strong) LocationProfileView *locationProfile;
于 2013-03-01T16:00:41.327 に答える