Hay ciertas circunstancias en las que generalmente se desaconseja utilizar el self.
-expresión acceder a una propiedad. Normalmente siempreusoself
para cualquier acceso de una propiedad. Es la forma más segura y sencilla. Especialmente si usó Retener, la administración de la memoria se hará por usted.
Las dos excepciones a esta regla:
- Cualquier
init
método.
- En
dealloc
.
En ambos casos se trata de un objeto parcialmente inicializado objeto. Hay algunos efectos secundarios que pueden ocurrir al usar setters o getters aquí, porque son métodos y, por lo tanto, pueden ser anulados.
Por ejemplo, tomar una clase con una propiedad A
foo
que ha sido una subclase de la clase B
. La subclase B
agrega una propiedad bar
y anula al colocador para foo
. Ahora su init
-metodo llama al setFoo:
, porque usó self.foo = ...
con algún valor inicial. La subclase, sin embargo, también tiene acceso al valor de bar
en este setter. Pero en este caso, puede suceder que la barra nunca se haya inicializado y apunte a datos arbitrarios. Llamar a un colocador en init mi causa se bloquea, aunque la probabilidad puede no ser demasiado alta en su propio código.
por lo que parece que es idéntica a la expresión 'this' de Java, que no siempre es necesaria a menos que se trate de variables con el mismo nombre – binnyb
Estás en lo cierto. –
Una diferencia importante es que 'self.str1 = @" abc "' usará el método de acceso ('setStr1:') pero 'str1 = @" abc "' no lo hará. Al usar propiedades con el atributo 'retener', esta diferencia es crítica. Entonces, realmente no es "idéntico a Java 'esto'". –