iT邦幫忙

0

objective c 中 "->" . "."的疑問

先上圖片吧
https://ithelp.ithome.com.tw/upload/images/20190911/20120634Tw2lCeKFA6.png

https://ithelp.ithome.com.tw/upload/images/20190911/2012063481TzDaSfSu.png

想請問大大為什麼會這樣,我原本想使用'.'但是系統卻叫我使用指向,這兩個在C不是類似的東西嗎,可以請大大告訴我這兩個東西在objective c的差異和為何要叫我使用'->'

至於他的錯誤提示的內容,我真的看不懂(每個字拆開來都懂,但兜在一起就.....),請大大幫忙

2 個回答

2
Samと可樂快跑
iT邦研究生 2 級 ‧ 2019-09-11 10:52:49
最佳解答

因為你寫在block裡面了。(或者稱之為closure)
不管是dispatch_async之類的
或是completionHandler
你寫在裡頭的東西不指定self->的話,他無法確切明白你所指向的變數是那個物件(通常是指自己的類別)
因為completionHandler的東西他所執行的地方通常並不是你這個類別。
你可以預期他是在你要求做完某件事之後,才來執行completionHandler的內容。
算是非同步執行的東西。
唯一不會寫self->的通常是protoctol指定delegate行為的狀況。
因為通常物件的delegate是指向self,所以符合在自己的類別實作protocol函式時,這個函式的內容就不用加self->了。

比較要注意的是retain cycle
通常為了避免記憶體參考,會在completionHanler之前加上:

__weak 類別 *weakself = self;

然後在completionHandler引用weakself來使用該類別的屬性及方法。
但因為設定在類別本身的變數並非屬性或類別
所以才要用self->來指定
另外如果是函式內變數或是全域的變數通常要給completionHandler使用的話。
假如你必須在block中改變這個變數的值的話。
必須宣告成

__block 型態 *變數名;

關於__weak、__strong或是__block這方面的東西是要多花一些時間了解就是了。

感謝您,我大概了解了,不過我可能需要時間去消化跟理解一下.....
最近剛好也在學習multithread的東西,感謝大大的指導

「但因為設定在類別本身的變數並非屬性或類別」
應該是
「但因為設定在類別本身的變數並非屬性或函式」
這樣才對。
打太快筆誤了。

2
黃彥儒
iT邦高手 1 級 ‧ 2019-09-11 10:29:00

他只是在跟你抱怨她找不到你指定的屬性……
然後你也說了他們類似,所以你的IDE就問你說:你是不是搞錯了,其實你要用的是->
這只是一個機械性的建議,所以沒辦法幫到你也是很正常的
最後,IDE沒有你想像中的那麼聰明
/images/emoticon/emoticon01.gif

我要發表回答

立即登入回答