ARC似乎正在释放我的NSViewController的视图

时间:2012-07-28 11:16:49

标签: objective-c cocoa automatic-ref-counting

我正在尝试解决一个更大的问题,而我正在倾向于ARC显然过早地将视图发布到我的NSViewController。我想:)所以我创建了一个简单的应用来重建这种情况。

我有一个简单的ARC Cocoa应用程序。在MainMenu.xib的窗口中,我将Custom View@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。它连接到一个名为-(IBAction)btnPressed:(id)sender的方法和一个NSTextView,它也被连接为IBOutlet

TestViewController.h我声明:

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

-(IBAction)btnPressed:(id)sender;

TestViewController.m然后我做

@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:]

我做错了什么? 感谢

2 个答案:

答案 0 :(得分:2)

添加属性以保存视图控制器。你的控制器目前没有任何东西可以让它在分配它的方法结束时保持活着。

添加:

@property (strong) TestViewController *tvc;

修改:

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

(我很好奇......如果您想要的是它包含的视图,您认为创建视图控制器的重点是什么?)


关于一般方法,似乎这是应该使用容器视图控制器实现的更正确的行为。该机制允许多个视图控制器以有组织的方式共享屏幕。

答案 1 :(得分:0)

您需要添加一个ivar或属性来保存TextViewController。目前,对它的唯一引用是在applicationDidFinishLaunching:的末尾消失,导致它被解除分配。

那很糟糕,因为你的按钮需要控制器来处理按钮按下。视图不会保留在它的控制器上,因为这会导致保留周期。因此,如果您不希望按钮与解除分配的对象通信,则您有责任保持控制器的运行状态。