2016-04-01 9 views
0

Ich habe einige Objective-C-Code:Wie referenzieren Sie einen Wert einer Klasse innerhalb einer Methode in derselben Klasse in Objective-C?

@interface CustomInitializers:NSObject 
{ 
    NSString *classStr; 
    NSInteger classInt; 
} 
+ (id) init; 
+ (id) initWithString: (NSString *) stringToSet; 
+ (id) initWithInteger: (NSInteger) intToSet; 
+ (id) initWithAll:(NSString *)stringToSet classInt:(NSInteger)intToSet; 
- (NSInteger) getClassInt; 
- (NSString *) getClassStr; 
@end 

Wenn ich diese Klasse implementieren, ich auf die Variablen verweisen, indem sie mit einem Unterstrich (z _classStr) voranstellen. Dies führt jedoch beim Kompilieren zu einem Fehler:

Wie kann ich dies verhindern?

Antwort

0

Die folgenden Instanzvariablen:

{ 
    NSString *classStr; 
    NSInteger classInt; 
} 

sind scoped beide Instanz Variablen für die Klasse. Wenn Sie eine Eigenschaft über:

@property (strong, nonatomic) NSString *classStr; 
@property (strong, nonatomic) NSInteger classInt; 
erstellen

Ein Getter und Setter werden generiert, um auf eine Instanzvariable zuzugreifen, die generiert wird. Die automatisch generierten Instanzvariablen bestehen aus dem Eigenschaftsnamen, dem ein Unterstrich vorangestellt ist.

Sie erstellen nur die Instanzvariable. Also:

NSString *classStr; 
NSInteger classInt; 

ist in der Tat Ihre Instanzvariablen. Wenn Sie sie wollten mit einem Unterstrich (richtige Methodik) vorangestellt werden, sollten Sie sie als solche setzt:

NSString *_classStr; 
NSInteger _classInt; 

In Wirklichkeit, wenn sie in der Kopfzeile sind, sollten Sie mit Eigenschaften werden. Nur private Instanzvariablen sollten als Bereichsinstanzvariablen ausgeführt werden, und diese würden in der Implementierungsdatei und nicht im Header vorhanden sein.

Es gibt viele Informationen da draußen noch im Detail zu erklären: link

+0

Thank you! Gibt es eine Möglichkeit, eine Eigenschaft daran zu hindern, einen Getter und Setter zu erzeugen? – InitializeSahib

+0

Nein, der Zweck einer Eigenschaft besteht darin, eine Getter/Setter/und Instanzvariable automatisch zu generieren. Es ist ziemlich Standard. Wenn Sie eine private Eigenschaft wünschen, legen Sie sie einfach in die Implementierungsdatei. Wenn Sie wirklich nur die Instanzvariable haben möchten (was normalerweise aus einem sehr speziellen Grund der Fall ist und normalerweise nicht ohne einen guten Grund empfohlen wird), tun Sie einfach das oben genannte Verfahren, um Ihre Variablen in Ihre Implementierungsdatei zu verschieben und einen Unterstrich zu markieren als Instanzvariablen. – TheCodingArt

+0

99% der Zeit sollten Sie Eigenschaften verwenden, obwohl – TheCodingArt

0

Wenn eine Variable innerhalb einer Methode deklariert wird, bedeutet dies, dass sie nur innerhalb dieses Bereichs existiert. Daher ist die einfache Antwort, dass Sie nicht darauf zugreifen können. Eine Lösung wäre, die Variable zu einer Instanzeigenschaft zu machen, so dass Sie von jeder Methode innerhalb Ihrer Klasse darauf zugreifen können.

Verwandte Themen