定义ivar的最佳方法是什么?

时间:2014-11-24 03:34:59

标签: ios objective-c xcode

我定义了三个属性,UISearchBar,NSDicitonary类型和NSArray类型。

他们之间的区别是什么? (自我。)或(_)

原因?

@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];

3 个答案:

答案 0 :(得分:3)

readwrite

此限定符是不必要的,因为它是默认行为。不要使用它,否则可能会让人感到困惑。

self.语法调用属性的getter和setter,可以由propertyNamesetPropertyName明确定义。

尝试使用self.语法,因为如果有一天您需要getter或setter,这会让事情变得更轻松。 通过_语法访问属性将直接访问属性,即使定义了getter / setter也是如此。

答案 1 :(得分:1)

希望这会有所帮助。

首先阅读此内容 https://stackoverflow.com/a/25759575/3767017

经过它后,下一件事就是自我

如果你这样做

 self.name = @"Xyz";

编译器将其更改为

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

并且在获取变量的情况下,它会将其转换为[self name];

答案 2 :(得分:-1)

当你声明像 -

这样的属性时
@property (nonatomic, strong)            NSDictionary *citiesDataDic;

这意味着你有两种方式来访问它。

self.citiesDataDic or _citiesDataDic

_citiesDataDic实际上是属性citiesDataDic的隐式ivar。 self.citiesDataDic实际上调用setter / getter。比如当你访问self.citiesDataDic时,getter方法实际上就像

- (NSDictionary)citiesDataDic
{
   return _citiesDataDic;
}

和setter方法将是

- (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释放旧值,因此不会发生内存泄漏。

这些东西实际上是手动引用计数。

术语非原子或原子用于线程访问控制,如果它不是原子的,那么几个线程可以同时访问setter / getter,而原子控制通过某种锁同时进行线程访问,在这种情况下你需要添加一些锁定setter / getter方法。