2011-04-25 64 views
0

我在.h文件中聲明瞭UIAlertView *警報。在func1中分配警報。並在func2中顯示&版本。這會導致內存BAD_EXEC_ACCESS問題。爲什麼UIAlertView需要本地化?

-(void) func1 
{ 
alert= [[UIAlertView alloc] initWithTitle:nil message:@"To Confirm." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 

} 

-(void) func2 
{ 
[alert show]; 
[alert release]; 
} 

如果我按照下面的方法確定。如果一切都在本地化的功能,那麼它確定。爲什麼?

-(void) func1 
{ 
alert= [[UIAlertView alloc] initWithTitle:nil message:@"To Confirm." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
[alert show]; 
[alert release]; 
} 

回答

-1

使用2函數方法,您不保留func1中的警報,並且此內存正在泄漏。然後,當你在func2中訪問alert(顯示它)時,它的保留計數仍然爲零,並且可能已經被釋放。 如果您在雙功能情況FUNC1添加

[alert retain]; 

,它應該工作。

在單個函數的情況下,您在同一範圍內分配並使用和釋放所有內容,因此沒有內存問題。

你也可以聲明

@property (nonatomic,retain) UIAlertView *alert; 
在.h文件中

,然後引用其作爲功能self.alert。 一定要@synthesize它,並釋放它在dealloc方法。

+4

'alloc'所攜帶的隱性'retain'。我不認爲這是真正的問題 - 我猜想會發生'func2'不止一次被調用,從而過度釋放警報。 – 2011-04-26 00:05:25

+0

我認爲諾亞是對的。我想知道func1和2是什麼 - 整個控制器在1到2範圍之外? – Rayfleck 2011-04-26 00:16:22

+0

問題解決了嗎?你如何使用這些功能?你能發佈代碼嗎? – Sid 2011-04-26 16:06:17

-1

當您在一種方法中分配它然後嘗試從另一個方法訪問它時,alertView會丟失範圍。

要麼調用[alertView保留]你FUNC1分配之後(並釋放它一旦你完成),或ALLOC它FUNC2

+0

邁克的答案說同樣的事情,但格式更好,所以參考那個:D – Sid 2011-04-25 23:55:43

+0

OP說'alert'是在頭文件中聲明的,所以scope不應該成爲問題。 – kubi 2011-04-26 00:10:13

+0

是的,我確實讀到了,即使在這種情況下,我所說的也是如此。試試吧...... – Sid 2011-04-26 00:47:04