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.

InformationsquelleAutor gitaarik | 2013-05-27
Schreibe einen Kommentar