ios属性知识梳理

其实对于基础知识的掌握还是很重要的,很多次都被属性声明绕的有点晕。索性做个总结,网上找了其他大牛的总结作为参考。下面进入正题:
1.通过self.name和_name获取局部变量的区别

@interface Person : NSObject

@property (nonatomic, copy) NSString* name;
@property (nonatomic, assign) NSUInteger age;

@end

@implementation Person

@synthesize name = _name;
@synthesize age = _age;

@end

上述代码,在xcode6以后 @synthesize部分可以省略。下面说一下_name和self.name的区别。
在Person对象实例化的时候,假设有一个person对象,此时编译器会自动生成_name这个变量,用来存储name这个属性。通过_name可以直接访问变量的name属性。
而self.name本质是调用实例对象属性的setter方法和getter方法。从而访问name属性。
2.setter方法和getter方法。
属性方法遵守一个简单的命名约定。getter的名字与属性名相同(如:属性名为date则getter的名字也为date),setter的名字则是属性名字加上set前缀并采用驼峰命名规则(如:属性名为date则setter的名字为setDate)。布尔类型的属性还可以定义一个以is开头的getter方法,如:

@property (readonly, getter=isBlue) BOOL blue;

可以这样理解,对对象中的属性进行读和写。就是对应的getter方法和setter方法。如果确定了对象的一项属性,那么使用property关键字声明之后,系统会自动生成对应的setter方法和getter方法。当然你也可以通过重写这两个方法来实现更多的功能。

@interface Person : NSObject
{
    NSString *_name;
    NSUInteger _age;
}

- (void)setName:(NSString*)name;
- (NSString*)name;
- (void)setAge:(NSUInteger)age;
- (NSUInteger)age;

@end

@implementation Person

- (void)setName:(NSString*)name {
//dosomething
    _name = [name copy];
}

- (NSString*)name {
    return _name;
}

- (void)setAge:(NSUInteger)age {
//dosomething
    _age = age;
}

- (NSUInteger)age {
    return _age;
}

@end

3.合成存取方法:@property
如若为每一个变量都写setter和getter无疑是很繁琐和没有必要的。此时合成存取方法就出现了。使用@property声明变量之后,会自动生成这两个方法,如果有必要,再进行重写,不然就按照默认的规范名称来访问属性。
可以这样理解,对象是一个变量,对象的变量里面也有name和age这样的变量,他们都需实现存取方法,那就将他们设置为属性。(合成了存取方法)。用@property进行声明,系统就默认生成对应的存取方法了。
注意:在声明一个属性(property)的时候尽量使用Foundation框架的数据类型,如整形使用NSInteger或NSUInteger表示,时间间隔的浮点类型使用NSTimeInterval表示,这样代码数据类型更统一。

4.懒加载
所谓懒加载,其实就是重写属性的getter方法,在属性被访问,或者被使用到的时候,再进行加载,节省系统资源
应用场景:

@interface XMGTopicViewController ()
@property (nonatomic, strong) NSMutableArray *users;
@end

@implementation XMGTopicViewController
- (NSMutableArray *)users  //1部分
{
    if (!_users) {                       //2部分
        _users = [NSMutableArray array];   //3部分
    }
    return _users;                  //4.部分
}

// 加载网络数据
self.users = [LXBUsers objectArrayWithKeyValuesArray:responseObject[@"user"]];

第一部分:self.users是一个getter
第二部分:不能写成 !self.users 这也是一个getter,getter中有getter会造成死循环
第三部分:可以使用self.users,这是一个setter
此处如果按照_users方法编写不会调用setter方法,如果自定义setter方法需要完成一些事情建议使用self.users的方式来设置
第四部分:不能使用self.users,这也是一个getter,getter中有getter会造成死循环
可以参照本文开头第一点理解懒加载写法。

接下来是重点部分:
5.对于@property的指示符
栗子:

@property(nonatomic, readonly, strong) NSMutableArray *users;

① nonatomic atomic:
指定合成存取方法是否为原子操作,可以理解为是否线程安全,但在iOS上即时使用atomic也不一定是线程安全的,要保证线程安全需要使用锁机制;
可以发现几乎所有代码的属性设置都会使用nonatomic,这样能够提高访问性能,在iOS中使用锁机制的开销较大,会损耗性能。
总之,就是只使用nonatomic。
② readwrite,readonly
如果忽略这个属性,那么系统默认是readwrite。生成setter和getter两个方法,如果指定了readonly,那么就只生成getter方法,没有setter方法。此属性也相对简单。
③ 重点来了
assign,strong,weak,copy,unsafe_unretained,retain
先简单粗暴的上结论:
对于标量类型NSInteger,NSUInteger,CGFloat,NSTimeInterval,使用assign类型。
对于有对应可变类型子类的对象比如:NSString/NSMutableString,NSArray/NSMutableArray,NSDictionary/NSMutableDictionary等,使用copy来修饰。copy也用来修饰block。
对于可变类型,一般使用强引用strong来修饰,如NSMutableString,NSMutableArray,NSMutableDictionary
还有其他必须强持有的对象,也使用strong来修饰。
weak表示对所赋的值对象持有弱引用表示一种“非拥有关系”(nonowning relationship),对新值不会增加引用计数,也不会减少旧值的引用计数。所赋的值在引用计数为0被销毁后,weak修饰的属性会被自动置为nil能够有效防止野指针错误。
weak常用在修饰delegate等防止循环引用的场景。
retain在MRC模式下,与strong相同。
一些注意点:assign也可以用于修饰NSString,但是由于不计算引用计数,如果属性被置为nil,并不会像weak一样自动销毁,所以如果nil以后再去self.name访问,就会发生野指针错误,程序崩溃。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容