2013-01-14 72 views
0

我試圖打印(nslog)嵌入在我創建的PhotoView對象中的照片的名稱。我創建了2個viewcontrollers類,PhotoView類擴展了UIButton類,以在之前的視圖控制器中填充網格。將字符串值傳遞給viewcontroller,但獲取EXC_BAD_ACCESS

在PhotoView.h我

@interface PhotoView : UIButton 
@property (assign, nonatomic) NSString *photoName; 
... 
在PhotoView.m

self.tag = [[data objectForKey:@"PhotoID"] intValue]; 
    self.photoName = [data objectForKey:@"PhotoName"]; 

對同一文件打印出來的標籤和photoName的值之後,一切看起來都不錯。當我嘗試點擊的PhotoView

-(void)didSelectPhoto:(PhotoView*)sender 
{ 
    NSLog(@"%@", [NSString stringWithFormat:@"%@", sender.photoName]); 
} 

點擊的PhotoView後後從另一個類打印photoName的價值,我得到EXC_BAD_ACCESS錯誤

問題開始。

但是,如果我做

NSLog(@"%@",[NSNumber numberWithInt:sender.tag]]) 

我沒有得到這個錯誤。

什麼可能是錯的?

在此先感謝。

回答

2

兩個備註:

  1. [NSString stringWithFormat:@"%@", sender.photoName] - 沒有請!沒有!不要這樣做!這不僅是多餘的,而且會浪費CPU週期,但也會嚴重降低可讀性。如果你有一個字符串,你不必重複它這個樣子,只是直接使用字符串對象:

NSLog(@"%@", sender.photoName); 
  1. 你有實際的錯誤是這樣的:

@property (assign, nonatomic) NSString *photoName; 

I.e。你有一個assign屬性,所以它不保留它的價值。當你的字符串對象超出範圍時,它會被釋放(因爲它不是weak,它不會自動設置爲nil,但它包含無效指針所在的任何垃圾值,因此會導致崩潰)。寫,而不是

@property (retain, nonatomic) NSString *photoName; 

,如果你不使用ARC,並

@property (strong, nonatomic) NSString *photoName; 

,如果你是。

+0

你說「'assign',a.k.a'weak'」。實際上,'weak'和'assign'有一個關鍵的區別。不應該暗示它們是相同的。另外,我可以建議你用適當的代碼更新你的第一個評論。解釋它是錯誤的和爲什麼是一回事,但是顯示正確的用法會更有幫助。 – rmaddy

+0

@rmaddy公平點,謝謝你的建議。查了差別,修正了代碼。 – 2013-01-14 22:09:07

+0

謝謝大家解決我的問題。我從未注意到這些屬性,只是盲目地跟隨教程。現在我將閱讀有關屬性可能具有的所有可能屬性。再次感謝。 – locorecto