84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
今天碰到一个问题,就是用到懒加载的时候,我用了self,结果报错直接蹦了,
我们老师说这是self递归引用了,可我还是不明白它们之间的区别
人生最曼妙的风景,竟是内心的淡定与从容!
self.x はプロパティにアクセスするためのものですが、実際には getX メソッドまたは setX メソッドにアクセスするためのものですが、ほとんどの場合、コンパイラーはこれら 2 つのメソッドを自動的に実装し、関連するインスタンス変数を自動的に作成します。よりも。 _x は、自動的に作成されるインスタンス変数です。 たとえば、次の属性を定義します:
次のような隠された (簡略化された) コードがたくさんあります:
遅延読み込みコードが属性の get メソッドをオーバーロードしていると思います。self.x は実際には [self x] メソッドを呼び出します。get メソッドで self.x を使用すると、この self.x が [self] を呼び出します。 x] メソッドを再度実行します。これは無限再帰です。
参照すれば違いはありません、同じポインタですが代入すると違います self.xx=oo まずxxretaincount -1して、次にretain oo _XXをコピーして直接ooを指すようにしています。保持ステップはありません。それも
私はあなたが次のような人かもしれないと推測しました:
その後、self.some を呼び出すと、[self some] を使用するのと同じになり、some 内の self.some は再度 [self some] を呼び出します。 。 。ループが形成されます。 。 。
アンダースコアは、set と get をバイパスして直接アクセスすることを意味します。 。
self.x はプロパティにアクセスするためのものですが、実際には getX メソッドまたは setX メソッドにアクセスするためのものですが、ほとんどの場合、コンパイラーはこれら 2 つのメソッドを自動的に実装し、関連するインスタンス変数を自動的に作成します。よりも。 _x は、自動的に作成されるインスタンス変数です。
リーリーたとえば、次の属性を定義します:
次のような隠された (簡略化された) コードがたくさんあります:
リーリー遅延読み込みコードが属性の get メソッドをオーバーロードしていると思います。self.x は実際には [self x] メソッドを呼び出します。get メソッドで self.x を使用すると、この self.x が [self] を呼び出します。 x] メソッドを再度実行します。これは無限再帰です。
参照すれば違いはありません、同じポインタですが代入すると違います self.xx=oo まずxxretaincount -1して、次にretain oo _XXをコピーして直接ooを指すようにしています。保持ステップはありません。それも
私はあなたが次のような人かもしれないと推測しました:
リーリーその後、self.some を呼び出すと、[self some] を使用するのと同じになり、some 内の self.some は再度 [self some] を呼び出します。 。 。ループが形成されます。 。 。
アンダースコアは、set と get をバイパスして直接アクセスすることを意味します。 。