我定义了三个属性,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];
答案 0 :(得分:3)
readwrite
此限定符是不必要的,因为它是默认行为。不要使用它,否则可能会让人感到困惑。
self.
语法调用属性的getter和setter,可以由propertyName
或setPropertyName
明确定义。
尝试使用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方法。