先上圖片吧
想請問大大為什麼會這樣,我原本想使用'.'但是系統卻叫我使用指向,這兩個在C不是類似的東西嗎,可以請大大告訴我這兩個東西在objective c的差異和為何要叫我使用'->'
至於他的錯誤提示的內容,我真的看不懂(每個字拆開來都懂,但兜在一起就.....),請大大幫忙
因為你寫在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的東西,感謝大大的指導
「但因為設定在類別本身的變數並非屬性或類別」
應該是
「但因為設定在類別本身的變數並非屬性或函式」
這樣才對。
打太快筆誤了。
他只是在跟你抱怨她找不到你指定的屬性……
然後你也說了他們類似,所以你的IDE就問你說:你是不是搞錯了,其實你要用的是->
這只是一個機械性的建議,所以沒辦法幫到你也是很正常的
最後,IDE沒有你想像中的那麼聰明