Re: [問題] 請問 IPC - 更改需求至 tcp/ip ; Object C 與 Xcode
記得以前偶爾會和朋友分辨清楚:
Visual C 是個產品
而 C 是種語言
Ansi C 是個標準
以上也許未達精確
我的意思是,討論時我很能容錯,因為我也常錯
所以只要聽得懂朋友說什麼,我們就繼續討論下去
朋友要混用三個詞我完全不介意;除非必需分辨它了
現在我又碰到這狀況了:
Object C 是種語言
Xcode 是個產品(這種語言的 compiler)
為什麼呢? 因為我買了本書,叫做 Object - C 無痛入門
裏面至少有兩點就踢中鐵板
1.@synthesize 保留字
書上說用這個取代 @property, 就可以連 get set 的本體程式都不用寫
但如果寫了,就以我們寫的為準;自動判斷,很方便
不過 Xcode 上我實測,打了 @synthesize 就 build fail
(更正,不會 build fail, 是我打錯地方了;我打在 interface 裏)
而 @property 就有自動補上 get set 本體的能力了 (其實這樣更好用)
2.書上說, Object C 的 class 可以沒有 base class,
並沒預設一定要從 NSObject 繼承起
實測上, Xcode 無法接受沒有 base class, 一定會 build fail
就舉以上兩例,也許我可以說, Object C 這本書,講的是這個語言的標準
而 Xcode 是一個實作這語言的 compiler,它有些許不同
更甚至,我擔心的是 Xcode 有版本差異(有版本當然會有差異;我意思是,不向舊版相容)
因為我從網路上抓到的 sample code 要 build 過就好辛苦
嗯,今天還沒 build 過
其實我今天趕的 dead line 是要寫出 tcp/ip server & client
剩沒幾個小時了 Orz
主管要求用 tcp/ip 實測能不能跨 task, 可以的話當然可以做 ipc
至於兩個程式無法同時執行,這我們可以克服
因為我們是 GPS 程式,有背景執行的權限..
--
活動/美食計劃
蘭嶼 魚白 勝興車站 星月天空 武陵 草嶺古道
嘉義阿里山小火車 保齡球 司馬庫斯
手包水餃 日月潭纜車 合歡攻頂 馬祖
鹽山 南庄 澎湖 溪頭/松林町 南投天梯
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.251.197.63
推
02/11 16:40, , 1F
02/11 16:40, 1F
→
02/11 16:46, , 2F
02/11 16:46, 2F
→
02/11 16:46, , 3F
02/11 16:46, 3F
→
02/11 16:47, , 4F
02/11 16:47, 4F
推
02/11 16:56, , 5F
02/11 16:56, 5F
→
02/11 16:57, , 6F
02/11 16:57, 6F
順便討論一下 gc
對於自動 reference count 的作法
其實我從 VC++ / MFC 轉過來,並不陌生
首先是 CString 物件,它就是自動管理記憶體
當無人 reference 它時,才釋放
接下來是 COM,雖然我 COM 始終學不好
只好模仿它做一些類似的 class
但教導 COM 的書裏就有完整介紹 reference count
其實 CString 也是用這概念
大致上,有人引用就 ref + 1
失去引用就 ref - 1
這點,並沒由 C++ 直接支援
而是由改寫一堆 operater function 達成
(比如 CString a = str
這樣會使 str 計數加一,那可能是改寫 constructor,可能是改寫 operator =
總之要改寫的點很多,但繁複的改寫後就可以打造出 reference count)
COM MODEL 比較方便的是,繼承就擁有這些
如果不用COM,也可以經由 template 來打造自己的 class
(同樣的我也沒學好,所以我無法弄出自己的自動記憶體管理物件;
都是半調子,可能只在 destructor 管理一下)
學到 Android/java 時,挺開心的,有 gc
對物件的理解是, 它是語言直接支援 reference count
但為什麼要跟我說, gc 是有一個獨立的 thread 在做呢?
如果有 refernce count,那就在 count 歸零時釋放就好
不必另一個 thread 啊..
然後現在到 Object C, 又跟我說它的 ARC 是由 compiler 實作
走 reference count!! 不必再一個 thread
(但也因此限制了我某些用法,我還搞不懂為何被限制)
我已經混亂了啊~~~
※ 編輯: HuangJC 來自: 60.251.197.63 (02/11 17:07)
推
02/11 17:36, , 7F
02/11 17:36, 7F
→
02/11 17:38, , 8F
02/11 17:38, 8F
→
02/11 17:39, , 9F
02/11 17:39, 9F
→
02/11 18:28, , 10F
02/11 18:28, 10F
→
02/11 18:29, , 11F
02/11 18:29, 11F
→
02/11 18:54, , 12F
02/11 18:54, 12F
→
02/11 18:56, , 13F
02/11 18:56, 13F
→
02/11 18:56, , 14F
02/11 18:56, 14F
我可以這樣說嗎?
CString, COM
都是有寫好的函式庫, frame work
它所用的 C++ 語法仍然是標準的;它沒有擴充或改寫 C++
它只是要預先引入函式庫而已
那這算 rc
→
02/11 18:57, , 15F
02/11 18:57, 15F
目前我只知道 C 的這種前置處理器
它要自己寫想去替換什麼,或者 #if #else, 也不過是協助 user 去實現 code 管理
有更廣義的前置處理器嗎? 或就指用這個?
其實要怎麼說它是前置處理器呢?
C 的那個很明確,因為被 #if #else 框出去不用的 code
就保障百分百不會影響流程,不會影響 code size
完全和執行期無關,也完全和後期 compile time 無關了
這在我們修改過於巨大,不明來源,前輩留下的 source code 時很有用
因為我保證是我幹的就我幹的,我沒幹的也保證不會影響別人
可以百分百沒有 side effect
當專案進行中,已經有產品 release 又要改 code
主管只接受這種修改
可以說,用一個全域布林變數
if ( bNew )
newcode();
else
oldcode();
這樣,雖然也漂亮,但主管就不接受了
因為多一個 byte 就不知會不會影響堆疊,根本不想冒險
那麼 ARC 是怎麼加,所謂前置處理器加的
我實在想見識見識
或者它不是 C 的那種前置處理器,是更廣義的?
謝謝
※ 編輯: HuangJC 來自: 60.251.197.63 (02/11 19:30)
→
02/11 20:19, , 16F
02/11 20:19, 16F
→
02/11 20:19, , 17F
02/11 20:19, 17F
→
02/11 20:20, , 18F
02/11 20:20, 18F
→
02/11 20:21, , 19F
02/11 20:21, 19F
→
02/11 20:21, , 20F
02/11 20:21, 20F
-----
推 johnlinvc:java的不是ref count, 他是跑generation GC 02/11 17:36
→ johnlinvc:也就是直接從object root去traverse,砍了走不到的 02/11 17:38
本來想說在 C++ 以後也可以自己寫這種邏輯
昨天突然發現我寫不出來
class C1 : RootClass{
}
C1 I1 = new C1();
像這樣, RootClass 裏要有什麼?
我可以在 C1 的 constructor 去註冊它自己
方法也不用自己寫,從 RootClass 繼承就好
class RootClass {
RootClass() {
Register(this); // 就簡單把 this 指標存入一個 list 裏就好
}
}
所以以後從 RootClass 裏就可以搜尋到所有物件
但我要怎麼知道某物件沒有人參考到它了?
I1 = null;
像這行就代表 I1 不再使用原物件,原物件可以刪除了
除非我 traverse 的方式不只尋找所有物件,還有尋找所有變數
比如維護兩個 list,
list1 裏面是物件,如上例中的 C1 物件
list2 裏面是變數,如上例中的 I1
一開始 I1 = C1, 所以 list1 中的物件有被使用到
後來 I1 = null, 所以把 list2 中的物件都繞完後,
發現 list1 裏有物件沒人使用了,刪除
這樣似乎可行,問題是我怎麼取得 &I1,這豈不是要在產生變時數馬上去註冊它
C1 I1 = new C1();
Register(&I1);
這種麻煩事還要自己做,而無法寫在 RootClass 內變成 transparent
那豈不是說一定要 compiler 支援?
因為 compiler 才知道我何時又要求一個變數了,何時變數從堆疊彈出了
(退出函式時, 變數 I1 的生命週期結束,雖然沒有 I1 = null 這句, 但一樣可以刪除了)
user 自己寫總是會漏勾的
與其如此,看到 CString 的記憶體管理那麼完整,使用時可以忘了它的存在
我覺得還是補上一些 method,內建 reference count 簡單多了
※ 編輯: HuangJC 來自: 60.251.197.63 (02/13 12:56)
※ 編輯: HuangJC 來自: 60.251.197.63 (02/13 19:46)
討論串 (同標題文章)
MacDev 近期熱門文章
PTT數位生活區 即時熱門文章