2015-03-06 3 views
0

У меня есть класс ниже:разница, когда объявлять переменную

@interface Person : NSObject { 
    NSString *_firstname; 
} 
@property NSString *firstName; 
@end 

@implementation Person 

@synthesize firstname; 

@end 

Это объявит три переменные: ПгвЬЫат, self.firstname и _firstname

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

+0

Главное, что вам нужно знать, это то, что этот способ делать вещи устарел и больше не нужен, и не понадобился в течение некоторого времени. Единственное объявление переменной, которое вам нужно знать, это версия '@ property', так как это автоматически сгенерирует' ivar' ('_firstname') и' @ synhesize' для вас, что автоматически упрощает чтение кода. – Popeye

ответ

1

В современной Objective-C вам не нужно создавать переменную экземпляра, если вы уже синтезируете свойства.
Из того, что вы пишете, кажется, что вы вводите в заблуждение свойства и ivar.
Свойства создают геттеры и сеттеры для ваших иваров, но они не являются иварами, это методы, которые получают доступ к вам, чтобы установить или получить их значения.
Ваш класс может быть подытожить так:

@interface Person : NSObject 
@property NSString *firstName; 
@end 

@implementation Person 

@end 

Во время компиляции это гарантирует, что вы можете получить доступ к Ивар, используя методы и назовите ваш Ивар, как _firstName.
Dot нотации создать доступ к свойствам так self.firstName (с использованием ARC и свойств по умолчанию параметра -nonatomic, сильно-) вызывает метод

- (NSString*)firstName 
{ 
    return _firstName; 
} 


Призывая self.firstName = @"foo"; звонков:

- (void) setFirstName:(NSString*)name 
{ 
    if (_firstName == name) { 
     return; 
    } 
    _firstName = name; 
} 


, подчеркивающие реализация может быть немного иной.

0

Первый NSString *_firstname; является переменной экземпляра. @property - это свойство, которое синхронизируется (вам не нужно вручную синтезировать свойства в современной Objective-C). Когда вы объявляете свойство, вы можете получить доступ к его переменной экземпляра с помощью _propertyName или с self.propertyName.

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

0

Вы можете экземпляр цепи с помощью собственности

@interface Person : NSObject { 
    NSString *_firstname; 
} 
@property NSString *firstName; 
@end 

@implementation Person 

@synthesize firstName = _firstname; 

@end 

Оба указателя указывают один экземпляр в настоящее время.

+0

Что произойдет, если я не назначу firstname = _firstname. и что отличается между self.firstname и firstname – NguyenStorm

+0

, если вы не связываете их, оба указателя будут разными, и они могут указывать на разные экземпляры. like self.firstName = @ "Name1" _firstName = @ "Name2" Name2 является приватным для вашего класса, который не подвергается другим – Zahid