84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
今天碰到一個問題,就是用到懶加載的時候,我用了self,結果報錯直接蹦了,
我們老師說這是self遞歸引用了,可我還是不明白它們之間的區別
人生最曼妙的风景,竟是内心的淡定与从容!
self.x 是存取屬性, 實際上是去訪問 getX 或 setX 方法,但是大部分時候,編譯器幫你自動實現了這兩個方法, 並自動建立了一個關聯的實例變量, 所以你感覺不到。 _x 就是那個自動建立的實例變數。 比如說你定義了下面這個屬性:
@property(nonation, strong) NSString *x;
有一堆隱藏的(簡化)程式碼如下:
NSString *_x; -(NSString *)x { return _x; } -(void)setX:(NSString *)x { _x = x; }
我猜你的懶加載程式碼就重載了屬性的get 方法,self.x 其實就是去調用[self x] 方法, 如果你在這個get 方法裡使用self.x, 那這個self.x 又去調用, [self x] 方法,這就是個無限遞歸了。
如果引用的話不會有區別,是同一個指針,如果賦值是有區別的 self.xx=oo 首先把xxretaincount -1然後retain oo _XX複製直接指向oo 不存在retain這一步步。也不會
我只是猜你可能是:
self.some = [self some]; -(type)some{ self.some = [...]; }
然後你在呼叫self.some時候 等於使用了[self some],some裡面的self.some再次呼叫了[self some]。 。 。形成了一個loop。 。 。
下劃線 就是直接訪問,越過了set get這些。 。
self.x 是存取屬性, 實際上是去訪問 getX 或 setX 方法,但是大部分時候,編譯器幫你自動實現了這兩個方法, 並自動建立了一個關聯的實例變量, 所以你感覺不到。 _x 就是那個自動建立的實例變數。
比如說你定義了下面這個屬性:
有一堆隱藏的(簡化)程式碼如下:
我猜你的懶加載程式碼就重載了屬性的get 方法,self.x 其實就是去調用[self x] 方法, 如果你在這個get 方法裡使用self.x, 那這個self.x 又去調用, [self x] 方法,這就是個無限遞歸了。
如果引用的話不會有區別,是同一個指針,如果賦值是有區別的 self.xx=oo 首先把xxretaincount -1然後retain oo _XX複製直接指向oo 不存在retain這一步步。也不會
我只是猜你可能是:
然後你在呼叫self.some時候 等於使用了[self some],some裡面的self.some再次呼叫了[self some]。 。 。形成了一個loop。 。 。
下劃線 就是直接訪問,越過了set get這些。 。