2013-03-09 127 views
1

正在創建一個ipad應用程序,我需要在ParentViewController的視圖中顯示一個ChildViewController,並使用下面的代碼完成它的工作。當chiledviewcontroller按鈕被點擊時,應用程序崩潰

- (void)viewDidLoad 
{ 
    FavViewController *aViewController = [[FavViewController alloc] initWithNibName:@"FavViewController" bundle:nil]; 
    [self.mainView addSubview:aViewController.view]; 
    [super viewDidLoad]; 
} 

當此favViewController加載到父視圖的self.MainView內部childViewController所有控制好的顯示的,但是當我上的UIButton點擊應用崩潰。下面是日誌的崩潰。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteMapTable myAction:]: unrecognized selector sent to instance 0x8093170' *** First throw call stack: (0x1733012 0x1558e7e 0x17be4bd 0x1722bbc 0x172294e 0x156c705 0x4a02c0 0x4a0258 0x561021 0x56157f 0x560222 0x4cfb1d 0x4cff02 0x4add4a 0x49f698 0x25fddf9 0x25fdad0 0x16a8bf5 0x16a8962 0x16d9bb6 0x16d8f44 0x16d8e1b 0x25fc7e3 0x25fc668 0x49cffc 0x255d 0x2485 0x1) libc++abi.dylib: terminate called throwing an exception

+0

'' - [NSConcreteMapTable myAction:]:無法識別的選擇器'意味着你有一個指向NSConcreteMapTable的指針,並且你嘗試使用它來調用「myAction」。請記住,指針的類型不能保證指向的對象是那種類型 - 你可以很容易地將事情弄糟,並將錯誤的對象類型轉換爲指針。 – 2013-03-09 12:52:02

+0

我發現解決方案,我需要添加下面的代碼'[self addChildViewController:aViewController];' – user1997951 2013-03-09 13:30:30

回答

3

這是造成的誤用UIViewControllers存儲器管理錯誤。

在您的-viewDidLoad中創建的FavViewController未被保留,因此將在您離開該方法後立即解除分配。

您已經使用控制器創建了一個視圖,從該視圖內的控件到控件的綁定操作,允許控制器被銷燬,然後嘗試通過點擊按鈕來觸發其中一個操作。

您看到的錯誤是因爲NSConcreteMapTable的一個實例現在佔用了曾經包含您的FavViewController的內存空間。

此外,您不希望任意嵌套屬於這樣的UIViewController子類的視圖。如果你需要這樣做,你應該使用「容器視圖控制器」方法來管理這些子控制器。 - addChildViewController:就是這些方法之一,並且恰好解決了這個問題,因爲父視圖控制器現在保留對子控制器的引用,所以它不會被解除分配。

相關問題