最近Objective C對於訪問變數是否做了修改?

時間 2021-06-09 04:21:29

1樓:

因為void (^getQuestionListFinished)(NSDictionary *) 這個block作為全域性變數宣告它會成為乙個NSGlobalBlock

這種block的其中乙個特性就是會強引用你寫在block裡面的所有變數, 但是不包括原始資料型別, 而__block修飾符就是專門針對block內對原始資料型別進行修改的, 在你使用這個修飾符並在block內使用這一變數時, block會為這個變數宣告乙個指標並對其指向的位址強引用

因此如果你放進block的本來就是乙個指標, . 而全域性變數是通過self的指標訪問的, 所以你不需要用__block也能直接修改,

不過block內引用self也會造成迴圈引用導致記憶體洩露.....所以最好是在block外用weak指標來指向你要使用的變數.......

不過你用weak指標就無法確保block在執行的時候物件一直存在, 所以你在block內再宣告乙個strong指標指向這個weak指標.....

不過這樣還是有在block執行前物件就已經不存在的問題, 所以最好在block內判斷一下你要使用的物件是否還存在…

2樓:明日黃花

block可以改變物件的成員變數值,不需要__block,因為這是存於堆區的;如果是棧區,是需要加__block的,而其實加上去之後,棧變數會被copy到堆區,之後變數位址會改變,你可以試試;

3樓:

你這個hasLogin的作用範圍是ServiceViewController,它並不是乙個區域性變數。

你可以在getQuestionListFinished的前面一行定義乙個區域性變數(不加__block修飾符),再在block裡面更改一下它的值試試看。

另外,如果你是用的ARC,你這樣寫會出現迴圈引用,如果是MRC倒還不會出現迴圈引用的問題,但是這兩個block的作用範圍就不能離開本函式了。

4樓:figure2008

這裡的 hasLogin 就是全域性變數。你可以試著寫乙個方法,把 hasLogin 在這個方法裡定義,把這個block 也放在方法裡。你再試試修改 hasLogin 的值,就知道原因了。

訪學(交換生)經驗對於研究生的申請有沒有幫助?

Jessica 最有幫助的還是工作實習背景,國外都非常重視實踐經驗,所以有乙份體面的實習經歷會非常加分,在申請學校上面會起到推動性作用,當然有經歷總是好的事情,不過能拿到證書或者推薦信是更好。 張勁松 這個要根據你自己背景來看 如果你語言成績高,非常優秀,可以混到好的推薦信,對你申請就非常的有利 如...

最近轉行中,對於產品手記發布的報告,對於轉行年齡是怎麼看的?

對於產品手記發布的報告個人認為是沒有這個觀點的,而且報告都是都是真實的產品經理相關資料,而這個產品手記發的這個報告,其實是乙個對產品經理職業的資料整合,而且你不用光看年齡的,這個大家都是知道年輕員工好,最主要的還是要看學歷,其次是要看閱歷,畢竟產品經理是乙個綜合能力要求較高的崗位,先不要管年齡都,起...

對於黨妹最近翻車,大家怎麼看

也許i 怎麼看?大環境就那樣唄。18抖音網紅莉哥現在都復出了,不覺得很魔幻嗎?乙個公然侮辱國歌然後被行拘的人都能復出吸金,與之相比在旅順博物館門口跳宅舞的又算什麼呢?我只能做到我不去看它們,不給它們刷流量罷了。說起這些事情就煩,為什麼會有人喜歡這種東西?還有人出來洗地?它們其實什麼都懂,甚至可以說就...