一举拿下ios属性的关键字

attributes
Attributes Attributes
atomic nonatomic
strong weak
readwrite readonly
getter setter
copy assign
retain unsafe_unretained

atomic

如果没有指明是nonatomic的,那么默认就是atomic。atomic的意思是数据的读写是线程安全的,这在多线程的时候非常有用,但是与nonatomic相比的话效率会低很多。所以为了提升效率,除非是在明确知道对象会在多线程中使用,否则尽量使用nonatomic关键字。

nonatomic

nonatomic不能保证数据的原子性,也就是说在多线程访问的时候不能保证能够正确读取数据,甚至有可能发生崩溃。如果使用了nonatomic关键字,这时候如果存在多线程访问的话,需要自己来处理线程的安全问题。

retain

ARC之前使用的关键字,ARC之后用strong代替。

strong

这是一个ARC之后才有的属性,在使用ARC的时候,这是一个默认属性。与它对应的是weak属性。strong使类能够拥有对象的所有权,会增加对象的 retain count 以保证在类使用该对象的时候,对象没有被销毁。strong可能会导致retain cycle,要谨慎使用,常使用在继承自NSObject的类和大部分自定义类
官方文档介绍:

// The following declaration is a synonym for: @property(retain) MyClass *myObject;
@property(strong) MyClass *myObject;

表示了strong和retain是同义词。

unsafe_unretained

ARC之前使用的关键字,类似于weak,但与weak不同的是在对象被销毁后,指针不会被置为空,所以有可能会造成崩溃

Paste_Image.png

weak (weak 对象释放的时候,怎么置为nil的呢?请阅读iOS 底层解析weak的实现原理

只是将指针指向该对象,但是并没有对象的所有权,在对象被释放的时候,weak指针会被置为nil,这保证了指针的安全, 在OC里是可以给nil对象发送消息而不会崩溃的,但是如果给一个被释放的对象发送消息就会崩溃了。weak不会增加对象的 retain count

assign

简单数据类型(int,long,double, float,Bool)默认就是assign的,不改变对象的retainCount。最好是只在简单数据类型时使用,对于对象类型,最好不要使用

readwrite

所有的属性默认都是readwrite的,使用readonly关键字可以覆盖该默认值。

readonly

表示对象是只读的。当我们不希望外面的类可以修改该属性的时候,可以在头文件中将属性定位readonly,但是在实现文件中,我们可以将它声明为readwrite,这样就只能在类内部才能修改这个属性了。

getter

指定get方法, 并需要实现这个方法. 必须返回与声明类型相同的变量,没有参数.

setter

指定 set 方法, 并需要实现这个方法. 带一个与声明类型相同的参数, 没有返回值(返回nil)当声明为 readonly 的时候, 不能指定 set 方法.
默认情况下,系统会生成一个与属性同名的getter、setter 方法,

copy copy还是strong?用copy还是mutablecopy

与strong不同的是,copy不会增加对象的 retain count
而是会重新复制一份对象,然后将指针指向新复制的对象。
使用copy关键字的属性的类型必须遵循NSCopying协议。
含有可深拷贝NSCopy子类的类,如NSArray,NSSet, NSDictionary, NSData, NSCharacterSet, NSIndexSet, NSString 等一般都用copy来修饰. 这是因为父类的指针可以指向子类对象, 使用copy的目的就是为了对象本身不受外界影响, 无论传给我一个可变还是不可变的对象, 我本身持有的都是一个不可变对象.

假如有一个属性是NSString类型的,但是我们却将一个NSMutableString赋值给了它(这是合法的),如果我们使用strong关键字,那么现在这个对象是一个NSMutableString的对象,如果在别的地方修改了这个对象的值,那么该属性也跟着变了,这可能会带来意想不到的后果。但如果我们使用copy关键字的话,就不会存在这个问题了,因为它会拷贝一份NSMutableString的值,这时属性依然是 immutable 的,即使NSMutableString的对象修改了也不会影响属性的值。

Block为什么使用copy修饰

DemoBlock内部没有调用外部变量时存放在全局区(ARC和MRC下均是)
DemoBlock2使用了外部变量,这种情况也正式我们平时所常用的方式,Block的内存地址显示在栈区,栈区的特点就是创建的对象随时可能被销毁,一旦被销毁后续再次调用空对象就可能会造成程序崩溃,在对block进行copy后,block存放在堆区.所以在使用Block属性时使用Copy修饰,而在ARC模式下,系统也会默认对Block进行copy操作

@synthesis

告诉编译器自动生成属性的 getter 和 setter 方法,并且为属性绑定一个成员变量,也就是说将属性的访问器方法作用于绑定的成员变量。正常情况下可以不使用@synthesis关键字,编译器也会默认生成访问器方法,在一些特殊情况下,需要明确使用@synthesis关键字才能生成访问器方法,包括以下情况:

  • 绑定非默认的实例变量。
    默认情况下,系统会生成一个_ 的成员变量与属性绑定在一起,如果不想使用系统生成的成员变量的话,可以通过@synthesis name = customName来绑定一个自定义的成员变量名。

  • 协议中定义的属性。
    当类实现的协议中包含属性时,必须在类中明确使用@synthesis才能生成访问器方法

  • 重写访问器方法。
    在重写 getter 和 setter 的时候需要用与属性相关的成员变量,由于重写了 getter 和 setter ,系统不会在默认合成这两个方法,也不会默认生成一个带下划线的成员变量,这时需要使用@synthesis关键字来定一个与属性对应的成员变量。

  • 类别(category)中定义的所有属性

  • 重载的属性
    重写了 setter 和 getter 或者只读属性的getter时

@dynamic

目的是告诉编译器访问器方法没有本类中实现,而是在别的地方(比如父类)中实现了,编译器就不会再发出警告了。主要是用在CoreData的NSManagedObject子类中。

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

推荐阅读更多精彩内容

  • 本文原创。仅限站内转载,站外转载请私信联系作者。 “The past is a bucket of ashes” ...
    尘世小书虫阅读 2,245评论 0 0
  • 提起战略,往往会给人云山雾绕的感觉。简单讲,战略决定的是一个公司到底往哪走的问题。如果你还不明白什么是战略,本文作...
    f74245ad6124阅读 162评论 0 0
  • 从西藏回来后,应妹妹“虫子”的邀请住在她家,协助她带几天小孩。原本今天就得回去,可是心里不太情愿走,口头上说走,人...
    木棉宝贝阅读 232评论 0 0
  • “它是生物体内的一种无形的“时钟”,实际上是生物体生命活动的内在节律性,它是由生物体内的时间结构序所决定。” 十二...
    忒胆小阅读 406评论 0 0