2014-02-18 4 views
0

В настоящее время я изучаю Obj-C для программирования iOS, но есть некоторые понятия, которые меня путают. В частности, аксессоры getter и setter.Confused О Getter and Setter

Я читаю несколько разных вещей о них - некоторые говорят, что они автоматически создаются при использовании @property, и нет необходимости устанавливать их вручную, другие говорят, что вам нужно использовать @synthesize.

См. Комментарии к приведенному ниже коду. Я смущен тем, что мне нужно на самом деле вручную, и правильным способом вызова метода.

// SomeClass.h  
#import <Foundation/Foundation.h> 

@interface SomeClass : NSObject 

@property (nonatomic, strong) NSString *firstName; 

-(NSString *) firstName; 

@end 


// SomeClass.m 

#import "SomeClass.h" 

@implementation SomeClass 

// DO I NEED THE CODE BELOW OR ARE THESE AUTO-CREATED? 
// **************************************************** 
-(NSString *) firstName { 
    return _firstName; 
} 

-(void) setFirstname:(NSString *) newValue { 
    _firstName = newValue; 
} 
// **************************************************** 

@end 


int main() { 

    @autoreleasepool { 

    SomeClass *aClass = [[SomeClass alloc] init]; 

    // How would you set the first name? 

    aClass.firstName = @"Richard"; //Does this call setFirstName? 

    // OR 

    [aClass setFirstName:@"Richard"]; 

    } 



    return 0; 
} 
+0

[ссылка] (http://rypress.com/tutorials/objective-c/properties.html) Проверьте это. Он отвечает на все – simonkaspers1

+1

Не то, что свойства строки обычно должны быть определены 'copy', а не' strong'. –

ответ

4

Некоторые из вещей, которые вы читаете, являются старой информацией. Обычно используется @synthesize (и все еще может быть использована), но она автоматически добавляется для вас во время компиляции (и вы должны использовать эту опцию).

В @interface вам не нужно -(NSString *) firstName;, потому что определение @property уже определяет это.

// НУЖДАЮТСЯ КОДЕКС НИЖЕ ИЛИ НЕ ИМЕЕТ ЭТО АВТО-СОЗДАН?

Нет, оно вам не нужно, оно автоматически генерируется для вас. Вы бы сами реализовали эти методы, если бы хотели сделать что-то особенное. Обычно автоматически сгенерированные версии великолепны, потому что вы указываете, как методы должны быть реализованы в определении @property (nonatomic, strong) и что он позаботился о вас. Если вы сами реализуете эти методы, вы подрываете это (поэтому определение @property может стать ложью ...).

aClass.firstName = @ "Richard"; // Это вызов setFirstName?

Да, так оно и есть. Компилятор фактически преобразует его в:

[aClass setFirstName:@"Richard"]; 

для вас.