iOS weak學習碰到的疑問

2021-09-07 17:55:29 字數 3337 閱讀 4855

__weak弱引用並不持有物件,所以賦值給__weak修飾符的變數也不會改變計數器的值.

main.m

id__strongobj3 = nil;

id__weak obj1= nil;

/*id __weak obj1 = obj;

編譯器的模擬**例如以下:

id obj1;

objc_iniitweak(&obj1,obj);

objc_destroyweak(&obj1);

*/@autoreleasepool

nslog

(@"obj3 retaincount = %ld",

cfgetretaincount

((__bridge

cftyperef

)(obj3)));

nslog

(@"obj1 retaincount = %ld",

cfgetretaincount

((__bridge

cftyperef

)(obj1)));

nslog(@"%d",_objc_autoreleasepoolprint());

/*列印例如以下:

objc[1029]: ##############

objc[1029]: autorelease pools for thread 0x7fff7455a300

objc[1029]: 1 releases pending.

objc[1029]: [0x101001000]  ................  page  (hot) (cold)

objc[1029]: [0x101001038]  ################  pool 0x101001038

objc[1029]: ##############

2015-07-24 23:02:39.686 objective-c物件與core foundation物件[1029:100223] 139077936

2015-07-24 23:02:39.687 objective-c物件與core foundation物件[1029:100223] obj retaincount = 2 -------->>>>>>>(1)

2015-07-24 23:02:39.688 objective-c物件與core foundation物件[1029:100223] obj1 retaincount = 3

-------->>>>>>>(2)

2015-07-24 23:02:39.688 objective-c物件與core foundation物件[1029:100223] obj3 retaincount = 2

-------->>>>>>>(1)

2015-07-24 23:02:39.688 objective-c物件與core foundation物件[1029:100223] obj3 retaincount = 1

-------->>>>>>>(3)

2015-07-24 23:02:39.688 objective-c物件與core foundation物件[1029:100223] obj1 retaincount = 2

-------->>>>>>>(4)

objc[1029]: ##############

objc[1029]: autorelease pools for thread 0x7fff7455a300

objc[1029]: 0 releases pending.

objc[1029]: [0x101001000]  ................  page  (hot) (cold)

objc[1029]: ##############

2015-07-24 23:02:39.688 objective-c物件與core foundation物件[1029:100223] 139077936

*//*1:由上面(1)可知__weak修飾符修飾的變數並不會持有物件

2:由(3)可知當__strong修飾的變數超出了作用域時,不在持有物件,導致reraincout - 1;

3:細心的讀者或許已經發現 obj1的retaincount和obj的不一樣呢?(這也是筆者最大的疑惑)

以下介紹筆者的思考過程

(1)__weak修飾的變數儘管是對物件的弱引用,他不改變賦值物件(obj)的引用計數(retaincount),但自身的retaincount會新增. -------->>> 但是他們是指向同乙個位址的,為何retaincount不一樣呢?所以這條路不通

(2)儘管他們是同乙個位址,但__weak不持有物件,但__weak修飾的變數想使用物件就必須使retaincount + 1,但同一時候並不改變物件的retaincount.帶著這個疑問最後讓我找到了答案 -->>在通過__weak指標尋找物件的時候,它有乙個修飾詞,當使用他的時候就會使返回的retaincount + 1(注意這裡並非retaincount本身).

4:持不持有乙個物件,

是看它是否導致物件的retaincount + 1;而不是看他是否指向那個位址.

*/

SpringBoot碰到的疑問或問題

1 responsebody 和 requestbody 的區別 requestbody是作用在形參列表上,用於將前台傳送過來固定格式的資料 xml 格式或者 json等 封裝為對應的 j abean 物件,封裝時使用到的乙個物件是系統預設配置的 httpmessageconverter進行解析,然...

iOS weak的底層實現

weak底層千千萬,吾竟裝作看不見.weak基本用法 weak是弱引用,用weak描述修飾或者所引用物件的計數器不會加一,並且會在引用的物件被釋放的時候自動被設定為nil,大大避免了野指標訪問壞記憶體引起崩潰的情況,另外weak還可以用於解決迴圈引用。weak原理概括 weak表其實是乙個hash ...

學習freeswitch碰到的問題

1.通話單聲道問題 2.fs集群問題 3.fs之間引數傳遞格式 sip h x 4.節點的配置錯誤,導致軟話機撥打 沒有鈴聲 5.originate慢的問題 使用bgapi 6.調查軟話機使用自動模式註冊,不能給掉起來的原因 7.為什麼沒有產生錄音檔案 8.上傳的錄音檔案為空 fs沒有實時把語音流存...