2011-05-20 58 views
0

我對iPhone的開發很陌生。我的目標是一個遠程控制應用程序,它的服務器是TightVNC。但是我遇到了一個問題,這讓我發瘋了......我已經成功連接到服務器(使用套接字),接下來想要至少每隔一秒鐘請求桌面更新。所以這裏是通過「performSelectorInBackground」中的選擇器創建的計時器。計時器的主要任務是爲同胞:NSData&malloc在NSTimer中,在定時器中使用大量內存

int picLength; 
[self readExact:(char*)(&picLength) bySize:sizeof(int)]; 
char *picBuffer; 
picBuffer = (char *)malloc(picLength); 
[self readExact:picBuffer bySize:picLength]; 
NSData *picData = [[NSData alloc]initWithBytes:picBuffer length:picLength]; 
[self performSelectorOnMainThread:@selector(setPicInMainThread:) withObject:picData waitUntilDone:YES]; 
[picData release]; 
free(picBuffer); 

而「setPicInMainThread」是如下(每張照片大約是200KB,iTouch的是通過計算機到計算機的無線網絡連接到PC,所以速度是夠快) :

- (void) setPicInMainThread:(NSData *)data { 
    [chatController.imageView.image release]; 
    chatController.imageView.image = [UIImage imageWithData:data]; 
} 

在展示第一個桌面更新後,該應用程序會崩潰。我在想,如果我遇到了關於NSTimer和NSData的「內存泄漏」,很多人都在談論......如果是這樣,有什麼辦法可以解決這個問題嗎?非常感謝您的幫助!

+0

我看不到在你的代碼中的計時器或在後臺線程中運行任何東西?也許你現在調用[self performSelectorOnMainThread:@selector(setPicInMainThread :) withObject:picData waitUntilDone:YES]來調試錯誤的版本; 與調用[self setPicInMainThread:picData]沒有區別; – Damien 2011-05-20 12:34:46

+0

你有什麼辦法定義屬性chatController.imageView.image? – Damien 2011-05-20 12:36:22

+0

[chatController.imageView.image發佈];看起來是在一個不尋常的地方。你能解釋一下你希望在這次電話會議中發生什麼? – Damien 2011-05-20 12:36:51

回答

0

您的malloc代碼看起來很糟糕。你爲什麼要把一個int的地址,然後把它作爲一個字符指針?那麼爲什麼甚至會傳遞一個int大小爲你傳遞一個char *來設置的相同函數呢?我有一種感覺,你正在得到一個EXC_BAD_ACCESS,這是因爲你的前幾行和readExact方法。確保您獲得正確的長度並傳遞正確的參數。

int picLength; 
[self readExact:(char*)(&picLength) bySize:sizeof(int)]; 
char *picBuffer; 
picBuffer = (char *)malloc(picLength); 
+0

非常感謝!我知道這看起來很糟糕,無論如何,它感覺有線在iPhone應用程序中使用malloc ...所以我放棄它,只需使用「char picBuffer [picLength];」但是我確定這個長度是正確的〜:-) – user762653 2011-05-20 13:08:00

+0

有一些在iPhone上使用malloc的有效案例,尤其是在與舊的C函數接口時,但它在我看來像是在錯誤地使用readExact,但我無法確定沒有看到碼。 – Joe 2011-05-20 13:14:25

相關問題