06 October 2012
恩,最近在寫Objective-C,
遇到了memory的一些問題,
也好險我有個好mentor可以問!


從Java跳過來這讓我有點點小混淆!
還記得我先前講過Java複製物件的問題嗎?
在Java中直接將instance化的物件,直接給予另一個物件!
這樣的情形中,這兩個物件是指向同個物件的!
假設我有兩個物件,分別為A、B!
如果A裡面的attribute變了!那麼B也會變!

當然這樣的情形在Objective C也是一樣的!
但是Objective C有個method,就是retain!
還有一個特殊的機制叫做reference counting
retain也是把原本的物件給另一個物件!
這兩個物件也是指向同一個物件!
而reference counting就是當這個物件被copy或者retain時,
他的reference count都會加1!
(retain 是原有物件會+1,copy是新的物件+1,copy就類似java的clone)


但我一開始遇到了一個寫法上的confused,一開始一直在想這兩種差別!
code如下
    Book *b1 = [[Book alloc]init]; // retain count=1沒問題
Book *b2 = b1; // retain count還是1,這我大概理解,就是把b2指向b1
Book *b3 = [b1 retain]; // retain count變2
[b1 setVal:20]; // 如果把b1物件中的value設值20,b2, b3也都會變


這時候如果把b2, b3的Val都印出來,也都會是20!
那麼我就在思考了這兩種的差異!

最後也大概知道了!
因為b2和b1算是共享同個物件!
如果這時候developer把[b1 release]掉!
b2也不能使用了!!
很容易發生bad access的問題!
所以大部份時候都要使用retain來進行物件的存取!(目前還想不到使用b2的方法用途)
以避免原有物件被release出來以後,現有的新物件才不會crash掉!














blog comments powered by Disqus