2015-06-23 3 views
0

У меня было несколько вопросов относительно моего объективного кода C, который я написал, и надеялся, что кто-то может помочь устранить мои сомнения. Это мой код до сих пор:Objective-C Self and Synthesize Ключевые слова

Это мой заголовок файла:

#import <Foundation/Foundation.h> 

@interface Animal : NSObject 

@property NSString *name; 
@property NSString *favoriteFood; 
@property NSString *sound; 

@property float weight; 

-(instancetype) initWithName:(NSString *) defaultName; 

-(void) getInfo; 

-(float) getWeightInKg: (float) weightInLbs; 

-(NSString *) talkToMe: (NSString *) myName; 

-(int) getSum: (int) num1 
    nextNumber: (int) num2; 

@end 

Это мой файл Реализация:

@implementation Animal 

- (instancetype)init 
{ 
    self = [super init]; 
    if (self) { 
     self.name = @"No Name"; 
    } 
    return self; 
} 

-(instancetype) initWithName:(NSString *) defaultName{ 
    self = [super init]; 
    if (self) { 
     self.name = defaultName; 
    } 
    return self; 
} 

-(void) getInfo{ 
    NSLog(@"Random Info About Animal"); 
} 


-(float) getWeightInKg:(float)weightInLbs{ 
    return weightInLbs * 0.4545; 
} 

-(NSString *) talkToMe:(NSString *)myName{ 
    NSString *response = [NSString stringWithFormat: @"Hello my name is %@", myName]; 
    return response; 
} 

-(int) getSum: (int) num1 nextNumber: (int)num2{ 
    return num1 + num2; 
} 
@end 

Это мой main.m файл:

#import <Foundation/Foundation.h> 
#import "Animal.h" 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     Animal *dog = [[Animal alloc]init]; 

     [dog setName:@"Bro"]; 

     NSLog(@"The Dog's name is %@", [dog name]); 

     Animal *newDog = [[Animal alloc]initWithName:@"Spot"]; 

     NSLog(@"The Dog's weight is equal to %.2f", [newDog getWeightInKg:50]); 

     NSLog(@"5 + 3 = %d", [newDog getSum:5 nextNumber:3]); 

     NSLog(@"%@", [newDog talkToMe:@"Bob"]); 

    } 
    return 0; 
} 

У меня было несколько вопросов относительно этого кода Я написал:

1) Когда я определить такие свойства, как:

@property NSString *name; 
@property NSString *favoriteFood; 
@property NSString *sound; 

мне нужно синтезировать эти свойства в моем файле реализации, чтобы получить-акцессоры методы ли? Я немного запутался в этом, так как в моем файле main.m я смог использовать метод setter ([dog setName: @ "Bob"]) для свойства: "@property NSString * name;" хотя я не синтезировал это свойство в своем файле реализации.

2) Кроме того, допустим, что я синтезирую свою собственность имени, выполнив:

@synthesize name = _name; 

Что представляет _name? Я читал в Интернете, что это соглашение синтезировать свойство, подобное этому, но что является точкой синтеза и как я могу использовать «_name» в моих файлах реализации или main.m?

3) В моем файле реализации в методе «- instancetype» init мы называем self = [super init]? Что именно возвращает эта строка «super init» в скобках?

4) Также в моем файле реализации, когда я пишу self.name = @ "No Name", к чему относится это ключевое слово self? Я читал в Интернете, что «сам относится к фактическому объекту, который выполняет текущий метод». Но мой вопрос в том, какой объект является этим ключевым словом self, ссылающимся на мой код, когда я делаю self.name = @ «No Name»?

+0

Один вопрос на вопрос, пожалуйста. –

+0

Soulchined Огромное спасибо! Это сообщение действительно прояснило все мои сомнения! – LP496

+0

Да, извините, включая четыре вопроса в одном сообщении. Я буду следить за этим в следующий раз. – LP496

ответ

3

Нужно ли мне синтезировать эти свойства в моем файле реализации для получения методов установки и получения?

Нет, до тех пор, пока вы не создадите свой собственный геттер и сеттер (или только геттер для свойств readonly), автоматически создаются подложки, геттеры и сеттеры.

Что представляет собой _name?

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

Почему мы звоните self = [super init]?

Потому что ваш класс может работать только в том случае, если его суперкласс был предварительно инициализирован.init возвращает сам объект по соглашению или nil, если что-то пошло не так.

Также в моем файле реализации, когда я пишу self.name = @"No Name", что делает это self ключевое слово?

self относится к объекту, в контексте которого выполняется метод. Поскольку это метод экземпляра, он всегда выполняется в контексте одного объекта, и этот самый объект - self. В вашем методе вы хотите изменить объект, на который был вызван метод, следовательно, вы получаете доступ к self.name.

1

Вам не нужно синтезировать, если не ясно, что вы будете использовать стандартную поддержку ivar. Я имею в виду это, скажем, у нас есть собственность как таковые:

@propert (strong, nonatomic, readonly) id someObject; 

Если бы мы переопределить его добытчик:

- (id)someObject { 
    if (!_someObject) { 
     _someObject = ...; 
    } 
    return _someObject; 
} 

Это не будет работать. Переопределяя getter свойства readonly, Xcode не уверен, что нам действительно нужен поддерживающий ivar. Мы должны были бы синтезировать его сами.

То же самое верно для свойства readwrite, где сеттер & геттер переопределяется.

Смежные вопросы