2010-06-20 34 views
0

我有一個帶有圖像子視圖的UIScrollView。我繼承touchesEnded添加對話框作爲一個子視圖如下:addSubview ScrollView - 不受控制的按鈕動作

- (void) pushInfoBox { 
    // the following line is referred to "myVC Caller" below 
    myViewController *myVC = [[myViewController alloc] 
           initWithNibName:@"myView" bundle:nil]; 
    [self addSubview:myVC.view]; 
    [myVC release]; 
} 

的觀點正確顯示,但是當我點擊myVC.view.backButton代碼執行跳轉到上面的「myVC來電」行。下一步轉儲-[myViewController performSelector:withObject:withObject:]: message sent to deallocated instance

奇怪的是myCaller.IBAction(backButton動作)沒有執行。

我期望在scrollview和push消息框之間啓用的用戶交互互相干擾,但我不確定如何正確處理這個問題。

關於如何解決這個問題的任何想法?

回答

1

您的代碼有幾個主要問題。我會穿行:

- (bool)pushInfoBox:(int)xPos down:(int)yPos window:(int)wPos {

首先,你不是在這個方法返回一個BOOL值,因此返回類型應該是void(如果它返回一個BOOL,請注意它的大寫,而不是現在的小寫字母)。其次,您提供xPos,yPoswPos作爲參數,但它們未在該方法中使用。所以,你的方法聲明應該看起來更像是這樣的:

- (void)pushInfoPox;

接下來的問題是在這裏:

myViewController *myVC = [[myViewController alloc] initWithNibName:@"myView" bundle:nil];

您分配的myViewController實例(順便說一下,類名應該總是有他們的第一個字母大寫)但從來沒有釋放它,所以你正在造成內存泄漏。你應該聲明myVC作爲一個實例變量,並在頭一個保留的財產:

@interface ... 
{ 
    ... 
    myViewController *myVC 
} 
... 
@property (nonatomic, retain) myViewController myVC; 
@end 

你應該像現在這樣被分配它:

myVC = [[myViewController alloc] initWithNibName:@"myView" bundle:nil];

它應該在dealloc發佈方法:

- (void)dealloc 
{ 
    [myVC release]; 
    [super dealloc]; 
} 

最後一個問題是在這一行:

[mBox release];

看不到所謂mBox被保持在該方法中的任何對象,使得線不應該存在。

+0

嗨Macatomy,感謝您的詳細解答。我對這個糟糕的問題表示贊同 - 試圖簡化日常工作。我添加了另一個編輯來糾正。 到你所做的要點: (a)布爾 - 我拿出了我使用的邏輯,因爲它與問題無關。將bool更改爲大寫。 (b)參數xPos,yPos和wPos - 同樣在這裏,將它從樣本中簡化爲 (c)釋放myVC - 這實際上是稍後的「[MBox發佈]」調用。 =>問題已更新 – iFloh 2010-06-20 18:36:54

+0

仍然存在問題。您正在分配視圖控制器,將其視圖添加爲子視圖,然後立即將其釋放。這是什麼導致你的問題。就像我在我的回答中所說的,myVC應該是一個保留的實例變量,它應該在dealloc中釋放,而不是在方法內部釋放。 – indragie 2010-06-20 18:48:39

+0

你是對的,按照你的建議,它的工作原理,但我不明白區別? – iFloh 2010-06-20 19:26:25