2014-11-24 5 views
0

Я определил три свойства: тип UISearchBar, NSDicitonary и тип NSArray.Каков наилучший способ определения ivar?

В чем разница между ними? (самостоятельно) или (_)

И причина?

@property (nonatomic, strong, readwrite) UISearchBar *searchBar; 
@property (nonatomic, strong)   NSDictionary *citiesDataDic; 
@property (nonatomic, strong)   NSArray  *initialOfCity; 

Первый способ:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSString *key = [_initialOfCity objectAtIndex:section]; 
    NSArray *citySection = [_citiesDataDic objectForKey:key]; 
    return [citySection count]; 
} 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"citydict" 
               ofType:@"plist"]; 
    _citiesDataDic = [[NSDictionary alloc] initWithContentsOfFile:path]; 
    _initialOfCity = [[_citiesDataDic allKeys] sortedArrayUsingSelector:@selector(compare:)]; 

    _searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; 
    _searchBar.placeholder = @"enter words"; 
    _searchBar.delegate = self; 
    [_searchBar sizeToFit]; 
} 

Второй способ:

NSString *key = [self.initialOfCity objectAtIndex:section]; 
    NSArray *citySection = [self.citiesDataDic objectForKey:key]; 
    return [citySection count]; 

    [super viewDidLoad]; 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"citydict" 
               ofType:@"plist"]; 
    self.citiesDataDic = [[NSDictionary alloc] initWithContentsOfFile:path]; 
    self.initialOfCity = [[self.citiesDataDic allKeys] sortedArrayUsingSelector:@selector(compare:)]; 

    self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; 
    self.searchBar.placeholder = @"enter words"; 
    self.searchBar.delegate = self; 
    [self.searchBar sizeToFit]; 
+0

'self.name' не ссылается на ivar, а ссылается на свойство. –

+0

@HotLicks благодарит ваш комментарий. Понял. –

ответ

3
readwrite 

Этот классификатор не нужно, поскольку это поведение по умолчанию. Не используйте его или это может смутить людей.

self. синтаксис вызывает геттер и сеттер вашего свойства, которое может быть явно определено propertyName или setPropertyName.

Попробуйте использовать синтаксис self., поскольку это упростит работу, если в один прекрасный день вам понадобится геттер или сеттер. Доступ к свойствам через синтаксис _ будет напрямую доступ к этому свойству, даже если определены геттер/сеттер.

+0

Это не 'getPropertyName'. Просто 'propertyName'. – sikhapol

+0

@SikhapolSaijit OOps, я занимаюсь слишком много дней в Java :( Я отредактировал мой ответ, спасибо! – Antzi

+0

@Antzi спасибо. Так что это лучший способ использовать getter' [_initialOfCity objectAtIndex: section] 'и setter' [ self.searchBar.delegate = self] 'в методе init, правильно? –

-1

Когда вы объявляете свойство, как -

@property (nonatomic, strong)   NSDictionary *citiesDataDic; 

Это означает, что у вас есть 2 способа доступа к нему.

self.citiesDataDic or _citiesDataDic 

_citiesDataDic - фактически неявный ivar объектов cityDataDic. где self.citiesDataDic на самом деле вызывает setter/getter. как при доступе self.citiesDataDic метод геттер на самом деле выглядит

- (NSDictionary)citiesDataDic 
{ 
    return _citiesDataDic; 
} 

и присваивателя будет

- (void)setCitiesDataDic:(NSDictionary *)citiesDataDic 
{ 
    if(_citiesDataDic != citiesDataDic) 
    { 
     [_citiesDataDic release]; // release the old value it point 
     _citiesDataDic = [citiesDataDic retain]; // retain the new value 
    } 
} 

Поэтому в основном при получении значения и вызова _citiesDataDic или self.citiesDataDic это то же самое, установив значение первый раз тоже такой же. Но при переопределении значения _citiesDataDic не выпускает старое значение (поскольку вы напрямую обращаетесь к нему), вызывают утечку памяти , но self.citiesDataDic выпускает старое значение, поэтому утечки памяти не происходит.

Эти вещи действительно предназначены для ручной подсчета ссылок.

Термин неатомный или атомный используется для управления доступом к потоку, если он не является атомарным, тогда несколько потоков могут одновременно получать доступ к установщику/получателю, тогда как атомное управление одновременным доступом к потоку через какой-то замок, в этом случае вам нужно добавить какой-то метод блокировки сетки/геттера.

+0

Anyways, спасибо –

1

надеюсь, что это поможет немного больше.

впервые прочитал эту https://stackoverflow.com/a/25759575/3767017

после прохождения через него следующую вещь само

если вы

self.name = @"Xyz"; 

Изменение компилятором его в

[self setName:@"Xyz"]; //(calling setter method) 

и тот же в случае получения e переменная, она переведет ее в [self name];

+0

Спасибо в любом случае. –

+0

@nhgrif спасибо,« ключ ». –