2011年8月28日 星期日

Objective-C 的記憶體回收機制(中)

在上一篇文章裡面談到了自己對物件記憶體的操作,難道就只有開發者會對物件做計數器(retainCount)的操作嗎?答案是否定!有一些 api 會自動對物件的 retainCount +1或是 -1,最常見的例子就是陣列的操作。例如:

NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity : 0];//array.retainCount = 1

NSString *str1 = [[NSString alloc] initWithString : @"A"];//str1.retainCount = 1
NSString *str2 = [[NSString alloc] initWithString : @"A"];//str2.retainCount = 1

[arr addObject : str1];//str1.retainCount = 2
[arr addObject : str2];//str2.retainCount = 2

[arr removeObject : str1];//str1.retainCount = 1
[arr release];//array.retainCount = 0;str2.retainCount = 1

//系統回收 array

[str1 release];//str1.retainCount = 0
[str2 release];//str2.retainCount = 0

//系統回收str1&str2

Objective-C 的記憶體回收機制(上)

這陣子為了 iPhone 學了 Objectiv-C ,一直對他的記憶體管理機制頗有微詞(笑),什麼時候該釋放,什麼時候該保留,真的是一點頭緒都沒有!建議初學者先把 Apple 官方的關於記憶體回收的說明文件先讀過一遍。(網頁版PDF版),內容有空的話我再翻譯!

首先先解釋為什麼變數有時候要加星號(*),有時候又不加。這是因為在 C 與 C++,以及基於這兩種語言加以改良的 Objective-C ,星號(*)代表的意思是指向某個記憶體的指標(pointer), 而不加星號(*)表示是取值,例如:

int number = 0;//取值

char[] name = ['n','a','m','e'];
char *str = name;//取址

2011年8月23日 星期二

html 檔案上傳控制項 onChange事件只會觸發一次

困擾了好久的問題,終於解決了!

原本的事件繫結

$("#file_upload").bind('change',function(){});

改成

$("#file_upload").live('change',function(){});

----以上是 JQuery 的用法-------

一般的做法是替換掉file_upload

$('#file_upload').replaceWith('<input id="file_upload" name="file_upload" type="file">');