2011-12-14 87 views
2

我有一個奇怪的問題。 鏈接PictureLink是.H得到一個NSString變量的值

NSString *pictureLink; 
} 
@property(retain,nonatomic) NSString *pictureLink; 

聲明全局變量我寫了這個代碼

NSString * myPictureUrl=[NSString stringWithFormat:@"http://mywebsite.com/uploads/%@.jpg",hash]; 
pictureLink=myPictureUrl; 

我有一個奇怪的結果,它必須是一個指針 或者

pictureLink=[NSString stringWithFormat:@"http://mywebsite.com/uploads/%@.jpg",hash]; 

我有EXC_BAD_ACESS錯誤

+0

如果可能的話使用ARC,那麼編譯器將處理幕後的所有保留計數。 – zaph 2011-12-14 14:34:39

回答

6

這是內存管理故障,y你不會在你的代碼中保留myPictureUrl

[NSString stringWithFormat:@"http://mywebsite.com/uploads/%@.jpg",hash];返回一個自動釋放的值,所以你有兩個選擇:

  1. pictureLink=myPictureUrl;應該像[self setPictureLink:myPictureUrl];
  2. 做一個[myPictureUrl retain];,不要忘記release它以後。

考慮爲您的項目使用ARC(自動保留計數)。使用ARC,編譯器負責保留計數,因此您不必實際不允許這樣做。有一個重構將轉換當前的項目。

+1

如果有一個屬性不在其周圍編碼,請使用屬性設置器/獲取器。直接指定到`pictureLink`將會創建一個由`pictureLink`指向的對象的內存泄漏。 – zaph 2011-12-14 14:26:35

+0

@Andrey謝謝你的完美工作。這是我的第一個應用程序,我從來沒有釋放對象:D它會導致我的問題? – user567 2011-12-14 14:28:43

2

您正在通過直接調用變量繞過@property,因此您的@property設置沒有提供magic,如保留和釋放。
您需要執行self.pictureLink才能使用@property
爲了避免直接訪問我的變量的誘惑我下面

NSString *theProperty 
} 
@property (nonatomic, retain) NSString *property; 

@synthesise property = theProperty; 

這樣,如果我走了@property我真的身邊,真的想做到這一點。
但是,你需要一個非常非常好的理由來做到這一點,然後事件可能不是一個很好的理由。