0

私はより大きな問題を解決しようとしていますが、ARC がビューを私の NSViewController にリリースするのが早すぎるという事実を指摘しています。と思います :) そこで、状況を再構築するための簡単なアプリを作成しました。

シンプルな ARC Cocoa アプリケーションがあります。のウィンドウで、で宣言されているMainMenu.xibaCustom Viewに aを接続します@property (strong) IBOutlet NSView *theView;AppDelegate.h

プロパティを合成してAppDelegate.mから、次のように呼び出します。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    TestViewController *tvc =  [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];
    [_theView addSubview:[tvc view]];
}  

TestViewControllerが表示されます-Custom View問題ありません。NSButton が 1 つ含まれています。これは、呼び出されたメソッドと-(IBAction)btnPressed:(id)senderIBOutlet.

私はTestViewController.h宣言します:

@property (nonatomic, strong) IBOutlet NSTextField *textField;
@property (nonatomic, strong) NSString *theString;

-(IBAction)btnPressed:(id)sender;

TestViewController.mI then doで

@synthesize theString = _theString;
@synthesize textField = _textField;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Initialization code here.
        _theString = @"Hello World";
    }

    return self;
}

-(IBAction)btnPressed:(id)sender
{
    [_textField setStringValue:_theString];
}

アプリを実行してボタンを押すとクラッシュします。ゾンビをチェックすると、次のように表示されます。

#   Address Category    Event Type  RefCt   Timestamp   Size    Responsible Library Responsible Caller
0   0x7f97a3047560  TestViewController  Malloc  1   00:00.652.631   128 TestARC -[AppDelegate applicationDidFinishLaunching:]
1   0x7f97a3047560  TestViewController  Retain  2   00:00.653.088   0   TestARC -[TestViewController initWithNibName:bundle:]
2   0x7f97a3047560  TestViewController  Release 1   00:00.653.089   0   TestARC -[TestViewController initWithNibName:bundle:]
3   0x7f97a3047560  TestViewController  Retain  2   00:00.653.912   0   AppKit  -[NSNib instantiateNibWithOwner:topLevelObjects:]
4   0x7f97a3047560  TestViewController  Release 1   00:00.658.831   0   AppKit  -[NSNib instantiateNibWithOwner:topLevelObjects:]
5   0x7f97a3047560  TestViewController  Release 0   00:00.662.377   0   Foundation  -[NSNotificationCenter postNotificationName:object:userInfo:]
6   0x7f97a3047560  TestViewController  Zombie  -1  00:01.951.377   0   AppKit  -[NSApplication sendAction:to:from:]

私は何を間違っていますか?ありがとう

4

2 に答える 2

2

ビュー コントローラーを保持するプロパティを追加します。現在、コントローラーには、それを割り当てるメソッドの最後を超えて存続させるものは何もありません。

追加:

@property (strong) TestViewController *tvc;

変更:

self.tvc =  [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];

(私は興味があります...ビュー コントローラーに含まれるビューだけが必要な場合、ビュー コントローラーを作成するポイントは何だと思いますか?)


一般的なアプローチに関しては、これはコンテナー ビュー コントローラーを使用して実装する必要があるより適切な動作のようです。このメカニズムにより、複数のビュー コントローラーが組織化された方法で画面を共有できます。

于 2012-07-28T12:10:42.893 に答える
0

TextViewController を保持するには、ivar またはプロパティを追加する必要があります。現在、それへの唯一の参照は最後に消え、applicationDidFinishLaunching:割り当てが解除されます。

ボタンの押下を処理するために、ボタンにはコントローラーが必要なため、これは悪いことです。保持サイクルが発生するため、ビューはコントローラーを保持しません。したがって、ボタンが割り当て解除されたオブジェクトと通信したくない場合は、コントローラーを保持する責任があります。

于 2012-07-28T14:06:07.340 に答える