我有一個的UIScrollView我UIViewController中在我.h文件中定義爲這樣:爲什麼我的財產是潛在的泄漏,我該如何解決?
#import <UIKit/UIKit.h>
@interface TestViewController : UIViewController <UIScrollViewDelegate>
@property (nonatomic, retain) UIScrollView * imageScrollView;
@end
在我的.m文件
然後,我有以下幾點:
@synthesize imageScrollView = _imageScrollView;
,我讀了這會自動創建我通常在.h文件中輸入的_imageScrollView? (UIScrollView * _imageScrollView)
我喜歡它,因爲它從我的.h文件中刪除了重複的代碼。現在在我的的loadView我做休息:
self.imageScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 480.0 - 20.0 - 49.0)];
[_imageScrollView setDelegate:self];
[_imageScrollView setPagingEnabled:YES];
[_imageScrollView setBounces:NO];
[_imageScrollView setShowsHorizontalScrollIndicator:NO];
[_imageScrollView setShowsVerticalScrollIndicator:NO];
[_imageScrollView setContentSize:CGSizeMake(320.0 * 3.0, 480.0 - 20.0 - 49.0)];
而在的dealloc釋放和零:
- (void)dealloc
{
[_imageScrollView release], _imageScrollView = nil;
[super dealloc];
}
現在構建的Xcode告訴我這個後:
Potential leak of an object allocated on line #linenumber
當我改變這個時,這將消失:
self.imageScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 480.0 - 20.0 - 49.0)];
這樣:
self.imageScrollView = [[[UIScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 480.0 - 20.0 - 49.0)] autorelease];
爲什麼我需要的時候,我在dealloc中釋放自動釋放呢?我究竟做錯了什麼?
此內存警告只發生在Xcode在我的iMac電腦安裝,而不是我的MacBook雪豹獅子...
啊是的,現在對我來說很有意義..(看起來我不能在這裏輸入)我怎樣才能避免autorelease?還是在這種情況下唯一的(也是最好的)選擇?通常當我創建一個臨時對象時,我會在完成它之後立即釋放它。如果可能有辦法在任何時候只保留一次,用這樣的東西填充autorelease池是否不好? –
Autorelease可能是您最好的選擇。確實,autorelease池可能會很慢,但前提是代碼被稱爲數千次。如果你在一個緊密的循環中分配了很多東西,那麼你可能需要創建一個臨時變量來指向你的新視圖,將imageScrollView設置爲它,然後在你的臨時變量上調用release。這樣你可以在釋放之前設置,所以你不需要autorelease。 (但是,只要你注意到它很慢)。 – andyvn22
你的意思是這樣的:UIScrollView * imageScrollView = [[UIScrollView alloc] init]; [self setImageScrollView:imageScrollView]; [imageScrollView發佈];該應用程序不是很慢(或者我至少沒有注意到它),但對於任何未來的項目,我只是想明白這一點(但我認爲現在是,現在再次感謝您!) –