objective-c - texto - como quitar las rayas rojas de word
Objective-C: ¿propiedades de solo lectura no sintetizadas con un subrayado ivar? (1)
Una propiedad no se sintetiza automáticamente si implementa todos los métodos de acceso requeridos (getter para una propiedad de solo lectura, getter + setter para una propiedad de lectura-escritura).
Debido a que implementa el método getter -(NSString *)myString
para la propiedad de solo lectura, no se sintetiza automáticamente. Si su getter necesita una variable de instancia para respaldar el valor de la propiedad, debe agregar la sentencia de síntesis (como lo hizo) o una variable de instancia.
Si entiendo correctamente, en Objective-C, las propiedades se sintetizan automáticamente con captadores y definidores, con la variable de instancia declarada como el nombre de la propiedad con un guión bajo ( _ivar
).
Por lo tanto, este código:
main.m
#import <Foundation/Foundation.h>
#import "hello.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
Hello *hello = [[Hello alloc] init];
NSLog(@"%@", hello.myString);
return 0;
}
}
Hola h
#import <Foundation/Foundation.h>
@interface Hello : NSObject
@property (copy, nonatomic) NSString *myString;
@end
Hola
#import "hello.h"
@implementation Hello
-(Hello *)init
{
if (self = [super init]) {
_myString = @"Hello";
}
return self;
}
-(NSString *)myString
{
return [NSString stringWithFormat:@"%@ %@", _myString, @"World"];
}
@end
Se puede compilar y ejecutar de esta manera:
bash-3.2$ clang -framework Foundation main.m hello.m -o hello
bash-3.2$ ./hello
2013-05-27 13:20:39.738 hello[23320:707] Hello World
Ahora cuando cambio la propiedad myString para que se lea solo así:
@property (readonly, copy, nonatomic) NSString *myString;
Entonces cuando intento compilar me sale un error:
hello.m:11:9: error: unknown type name ''_myString''; did you mean ''NSString''?
_myString = @"Hello";
^~~~~~~~~
NSString
Así que _myString
no está definido. ¿El compilador no sintetizó la propiedad con la variable de instancia _myString? A ver si funciona cuando lo sintetizo yo mismo:
En la implementación de hello.m:
@synthesize myString = _myString;
Ahora vuelve a funcionar:
bash-3.2$ clang -framework Foundation main.m hello.m -o hello
bash-3.2$ ./hello
2013-05-27 13:36:59.916 hello[24219:707] Hello World
Entonces, mi pregunta es, ¿por qué no se sintetiza automáticamente con un subrayado ivar cuando se usa readonly
en las propiedades? ¿O estoy totalmente en el camino equivocado para entender cómo funcionan estas cosas de Objective-C?
Apreciaría mucho una respuesta explicativa, ya que realmente quiero entender qué está sucediendo exactamente y por qué.
Gracias de antemano.