Objective-C - readonly-Eigenschaften, die nicht synthetisiert, mit Unterstrich ivar?
Wenn ich das richtig verstehe, in Objective-C, Eigenschaften automatisch synthetisiert, mit Getter und setter, mit dem Instanz-variable deklariert, wie die Eigenschaft name mit einem Unterstrich vorangestellt (_ivar
).
So, in diesem code:
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;
}
}
Hallo.h
#import <Foundation/Foundation.h>
@interface Hello : NSObject
@property (copy, nonatomic) NSString *myString;
@end
Hallo.m
#import "hello.h"
@implementation Hello
-(Hello *)init
{
if (self = [super init]) {
_myString = @"Hello";
}
return self;
}
-(NSString *)myString
{
return [NSString stringWithFormat:@"%@ %@", _myString, @"World"];
}
@end
Kompiliert werden können und laufen wie diese:
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
Nun, wenn ich die myString-Eigenschaft auf readonly so:
@property (readonly, copy, nonatomic) NSString *myString;
Dann, wenn ich versuche zu kompilieren bekomme ich eine Fehlermeldung:
hello.m:11:9: error: unknown type name '_myString'; did you mean 'NSString'?
_myString = @"Hello";
^~~~~~~~~
NSString
So _myString
ist nicht definiert. Hat der compiler nicht synthetisieren Sie die Eigenschaft mit Instanz-variable _myString? Mal sehen, ob es funktioniert, wenn ich es selbst synthetisieren:
Hallo.m Umsetzung:
@synthesize myString = _myString;
Nun funktioniert es wieder:
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
So, meine Frage ist, warum ist es nicht automatisch synthetisiert, die mit einem Unterstrich ivar wenn Sie readonly
auf Eigenschaften? Oder bin ich völlig auf dem falschen Weg zu verstehen, wie das Objective-C funktioniert das?
Wäre ich sehr dankbar, erklärende Antwort, weil ich wirklich wollen, um zu verstehen, was genau passiert und warum.
Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Immobilie ist nicht automatisch synthetisiert wenn Sie implementieren alle erforderlichen Zugriffsmethoden (getter für eine nur-Lesen-Eigenschaft, getter + setter für lese- /schreib-Eigenschaft).
Weil implementieren Sie die getter-Methode
-(NSString *)myString
für die nur-Lesen-Eigenschaft,es ist nicht automatisch synthetisiert. Wenn Ihr getter benötigt eine Instanz-variable für die Sicherung der Wert der Eigenschaft, die Sie hinzufügen müssen, um die Synthese-Anweisung (wie du hast) oder eine Instanz-variable.