0

我有ARC問題。經過幾個小時的調試,我放棄了,並決定在這裏檢查。ARC不會發布實例變量

基本上我有一個MainViewController,它創建了PreviewsView的實例。

PreviewsView我有代表且dataSource屬性:

@property (nonatomic, unsafe_unretained) IBOutlet id<PreviewsDataSource> dataSource; 
@property (nonatomic, unsafe_unretained) IBOutlet id<PreviewsDelegate> delegate; 

我在MainViewController創建的PreviewsView實例,設置self作爲delegatedataSource,把它添加到查看並保存爲一個實例變量:

- (void)addPreviews { 
    previewsView = [[PreviewsView alloc] initWithFrame:CGRectMake(0, 75, 1024, 480)]; 
    previewsView.dataSource = self; 
    previewsView.delegate = self; 
    [self.view addSubview:previewsView]; 
} 

然後,當我從導航控制器中刪除MainViewController ACR解除分配時,BUT previewsView仍然存在(W HY ???)並且實際運行觸發[self.delegate doSomeStuff]的方法。由於MainViewController已經釋放 - 它會拋出EXC_BAD_ACCESS

所以基本上:

  • MainViewController實例擁有的PreviewsView實例(previewsView)的MainViewController
  • 比如在PreviewsView
  • 指定爲delegatedataSourceMainViewController釋放實例之後,previewsView仍然活着,運行。

任何想法爲什麼? 謝謝。

+1

是否有意創建一個名爲'previewsView'的視圖(在'addPreviews'方法中),但添加完全不同的子視圖('previewsCaroucel')? – omz 2012-04-26 15:10:10

+0

對不起,這是因爲在發佈之前重命名變量 – OgreSwamp 2012-04-26 15:14:43

回答

1

unsafe_unretained不是零伊娃。 __weak確實。

MainViewController成員previewsView是否保留它?在viewDidUnload中或在完成previewsView之後,將其設置爲零,即:previewsView = nil

通常所有IBOutlets或子視圖都是ivars應該是__weak。如果在將其添加爲子視圖後不需要previewsView,則可以刪除ivar。

希望這會有所幫助!

+0

AFAIK'weak'在iOS 4.x中不可用,所以這對我來說不是解決方案。 – OgreSwamp 2012-04-26 15:07:51

+1

在那個原因中,你必須顯式地刪除你的成員,或者不保留它。 – 2012-04-26 15:08:33

+0

在這種情況下,nil將如何幫助? Nil不會發布預覽視圖,previewsView仍然會引用已發佈的MainViewController。 – OgreSwamp 2012-04-26 15:11:34

2

您需要將您的代表設置爲零,然後才能釋放MainViewController,如 previewsView.delegate = nil; previewsView.dataSource = nil;

優選的調用這段代碼在你的dealloc方法MainViewController - >你仍然可以使用ARC也使用這樣的

- (void) dealloc 
{ 
    previewsView.dataSource = nil; 
    previewsView.delegate = nil; 
    [super dealloc]; 
} 

你應該記住的是,協議的假設!您的previewsView實例仍然「活着」(通知以同樣的方式工作),並嘗試將消息發送到您的實例,無論它是死還是活。因此,當MainViewController被釋放時,previewsView也是,但代表仍然「活着」。因此,您需要將它們設置爲零來將它們取消打開;)