1.格式

@property (参数1,参数2,...) 类型 名字;

eg:
@property(nonatomic,retain) UIWindow *window;
其中参数主要分为三类:
• 读写属性: (readwrite/readonly/setter = /getter = )
• setter语意:(assign/retain/copy)
• 原⼦子性: (atomicity/nonatomic)
• nullability annotations: (nonnull/nullable)

参数意义:

- readwrite  产生setter\getter⽅方法
- readonly 只产生简单的getter,没有setter, 默认的读写属性
- setter 指定生成setter⽅法的名字
- getter 指定生成getter方法的名字
- assign 默认类型,setter方法直接赋值,而不进⾏retain操作,适⽤于基本数据类型, 对象类型, 不会发⽣生引用计数变化
- retain setter方法对参数进⾏行release旧值,再retain新值
- copy setter方法进⾏行Copy操作,与retain一样
- atomic 保证多线程访问下的安全,但浪费系统资源,原子性控制的默
认设置
- nonatomic 禁⽌多线程,变量保护,提高性能
- nonnull 表示对象可以是NULL或nil
- nullable 表⽰对象不应该为空

2.重要属性对比

  • <atomic> VS <nonatomic>
1.atomic 是默认的属性,表示对象的操作属于原子操作,主要是在多线程的环境下,提供多线程访问的安全。
我们知道在多线程的下对对象的访问都 需要先上锁访问后再解锁,保证不会同时有⼏个操作针对同⼀个对象。
如果编程中不涉及到多线程,不建议使用,因为使用atomic⽐比nonatomic更耗费系统资源。
2.nonatomic 表⽰访问器的访问不是原⼦操作,不支持多线程访问安全,但 是访问性能⾼。
  • <readwrite> VS <readonly>
1.readwrite 是默认的属性,表⽰可以对象进⾏读和写,自动生成setter和getter⽅法。
2.readonly 表示只允许读取对象的值,只会生成对象的getter⽅法。 //以下等价
@property (nonatomic,retain) NSObject *object;
@property (nonatomic,retain,readwrite) NSObject *object;
  • < retain >, < assign > VS < copy >
1.retain 表⽰示对NSObject和及其⼦子类对象release旧值,再retain新值,使对象的应⽤计数增加⼀。
该属性只能使⽤用于obejective-c类型对象,不能用于Core Foundation对象。 2.assign 是默认属性,只可以对基本数据类型(如CGFloat, NSInteger,Bool,int,代理对象)等使⽤。
该方式会对象直接赋值而不会进行retain操作。 3.copy 表⽰重新建立一个新的计数为1的对象,然后释放掉旧的值。
都知道retain是对指针的拷⻉,copy是对内容的拷⻉。 eg:NSString 对象 的地址为0x100,其内容为“string”
如果使用copy到另外一个NSString对 象,则会⽣生成另外⼀个地址为0x110的对象,只不过内容仍然是’string“。
如果使用retain到另外一个NSString对象,则该对象的地址仍然为0x100,只不过 该对象的计数变为2.
retain 是指针拷贝
copy 是内容拷贝
//在拷贝之前,都会释放旧的对象。 assign:简单赋值,不更改索引计数(Reference Counting)。
copy :建立一个索引计数为1的对象,然后释放旧对象
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的输入对象的索引计数为1
//事例说明
@property (nonatomic,retain) TestObject *object;
@property (nonatomic,copy ) TestObject *object; /********** Getter等效代码***********/
//.m中getter等效代码
- (TestObject*)object{
return object;
}
//.m中getter等效代码
- (TestObject*)object{
[object retain];
return [object autorelease];//用完立即释放
} /********** Setter等效代码分析***********/
- (void)setObject:(TestObject*)newObject{
if(object != newObject){
[object release];
object = [newObject copy];
}
}
  • < strong > VS < weak >
  目的:对象声明时需要加⼊入strong和weak,方便内存的自动管理。
->strong:强引⽤用,默认的属性,类似于retain,其实是一个相对的概念,就是一个引用。
默认的所有实例变量和局部变量都是strong指针。
如果有一个强引⽤持有该对象,则该对象就不能被释放。
->weak:弱引⽤,类似于assign,弱引用除了不决定对象的存亡外,其他与强引用相同。
即使一个对象被持有⽆数个若引用,只要没有强引用指向他,那麽其还是会被清除,它不是对象的拥有者。
其值会在对象被释放后自动设置为nil。
weak指针主要用于“父-子”关系,父亲拥有⼀个⼉子的strong指针
因此父亲是儿子的所有者;但为了阻止所有权循环,儿⼦需要使用weak指针指向父亲。 eg:典型例⼦是delegate模式
ViewController通过strong指针(self.view)拥有⼀个UITableView的dataSource和delegate都是weak指针
  • < nonnull > VS < nullable >
1. swift:可以使⽤!和?来表⽰一个对象是optional的还是non- optional,如view?和view!。
2. Objective-C:没有这一区分,view即可表示这个对象是optional,也可表示是non-optional。
说明:这样就会造成一个问题: 在Swift与Objective-C混编时,Swift编译器并不知道一个Objective-C对象到 底是optional还是non-optional,因此这种情况下编译器会隐式地将Objective- C的对象当成是non-optional。  为了解决这个问题,苹果在Xcode 6.3引⼊入了⼀个Objective-C的新特性: nullability annotations。这⼀新特性的核⼼心是两个新的类型注释:nullable 和nonnull。 ->nullable 表⽰对象可以是NULL或nil
->nonnull 表示对象不应该为空
说明:当我们不遵循这一规则时,编译器就会给出警告。
在任何可以使用const关键字的地⽅都可以使⽤nullable和nonnull,不过这两个关键字仅限于使用在指针类型上。
在⽅法的声明中,我们还可以使用不带下划线的nullable和nonnull //建议对象属性不能为空,使用方式1
@property (nonatomic,copy,nonnull) NSArray *items;//方式1
@property (nonatomic,copy ) NSArray *items;//方式2

3.错误代码属性设置

错误1:

//错误写法
@property (nonatomic) NSString *name;
@property (nonatomic,assign) NSString *name//等价
//正确写法
@property (nonatomic,copy ) NSString *name; 分析:不是基本数据类型的对象,所以默认的assign修饰符是不行的,由于atomic, readwrite,assign是默认,以下写法是可行的: //正确写法
@property NSInteger maxCount;
@property (atomic,assign,readwrite) NSInteger maxCount;//等价

4.总结

说明:手动实现getter和setter方法(atomic/nonatomic/retain/ assign/copy定义的对象)
只是给编译器的建议,编译器首先会到代码⾥里⾯去找。
1.如果定义了相应的getter和setter的方法,那么好,⽤手动定义的getter&&setter方法
2.如果没有,编译器就会根据对象自动生成相应的getter和setter方法

5.⭐️⭐️⭐️⭐️重点总结⭐️⭐️⭐️⭐️

重点!!!重点!!!重点!!!!

1.copy  使用类型 :NSString,block
2.assign使用类型 :delegate,int,float,NSInteger,bool,枚举,结构体...
3.retain使用类型 :NSArray,NSDate
4.strong使用类型 :NSString/block以外的OC对象
5.weak 使用类型 :当2个对象相互引用,一端用strong,一端用weak;
6.readOnly :只读时候(即只需要getter方法的时候);
readWriete :默认属性(getter&&setter方法)

6.补充

属性中的修饰词 - 我的理解 :
------------------------------------------------------------------------------
assign ( ARC/MRC )
1.这个修饰词是直接赋值的意思 , 整型/浮点型等数据类型都用这个词修饰 .
2.如果没有使用 weak strong retain copy 修饰 , 那么默认就是使用 assign 了. ( 它们之间是有你没我的关系 )
3.当然其实对象也可以用 assign 修饰 , 只是对象的计数器不会+1 . ( 与 strong 的区别 )
4.如果用来修饰对象属性 , 那么当对象被销毁后指针是不会指向 nil 的 . 所以会出现野指针错误 . ( 与weak的区别 ) ------------------------------------------------------------------------------
weak ( ARC )
1.弱指针是针对对象的修饰词 , 就是说它不能修饰基本数据类型 .
2.weak 修饰的对象计数器不会+1 , 也就是直接赋值 .
3.弱引用是为打破循环引用而生的 .
4.它最被人所喜欢的原因是 它所指向的对象如果被销毁 , 它会指向 nil . 而 nil 访问什么鬼都不会报野指针错误 . ------------------------------------------------------------------------------
strong ( ARC )
1.直接赋值并且计数器 +1 .
2.在 ARC 里替代了 retain 的作用 . ------------------------------------------------------------------------------
retain ( MRC )
1.release 旧对象( 旧对象计数器 -1 ) , retain 新对象( 新对象计数器 +1 ) , 然后指向新对象 .
2.在set方法里面是这样的 : if (_delegate) {
[_delegate release];
}
_delegate = [delegate retain]; ------------------------------------------------------------------------------
copy ( ARC/MRC )
1.copy 在 MRC 时是这样做的 release 旧对象( 旧对象计数器 -1 ) , copy 新对象( 新对象计数器 +1 ) , 然后指向新对象 .
1.1在set方法里面是这样的 : if (_delegate) {
[_delegate release];
}
_delegate = [delegate copy];
2.copy 在 ARC 时是这么干的 copy 新对象( 新对象计数器 +1 ) , 然后指向新对象 .
2.1在set方法里面是这样的 : _delegate = [delegate copy];
3.使用注意 :
3.1 修饰的属性本身要不可变的 . 例如 NSMutableArray 采用 copy 修饰 , 添加元素表面上可以 一到运行就崩溃了 , 因为 copy 过后实际上成了NSArray了 . ( 队友 , 我们不吭你 )
3.2 遵守 NSCopying 协议的对象使用 . ------------------------------------------------------------------------------
nonatomic ( ARC/MRC )
1.不对set方法加锁 .
2.性能好
3.线程不安全 atomic ( ARC/MRC )
1.原子属性就是对生成的 set 方法加互斥锁 @synchronized(锁对象) . @synchronized(self) {
_delegate = delegate;
}
2.需要消耗系统资源 .
3.互斥锁是利用线程同步实现的 , 意在保证同一时间只有一个线程调用 set 方法 .
4.其实还有 get 方法 , 要是同时 set 和 get 一起调用还是会有问题的 . 所以即使用了 atomic 修饰 还是不够安全 . ------------------------------------------------------------------------------
readonly
1.让 Xcode 只生成get方法 .
2.不想把暴露的属性被人随便替换时 , 可以使用 . ------------------------------------------------------------------------------
readwrite
1.让 Xcode 生成get/set方法 .
2.不用 readonly 修饰时 , 默认就是 readwrite . ------------------------------------------------------------------------------
getter/setter 的自定义方法名 .
1.一般对于 有/无 是/否 等这样的属性 , getter 方法名前面加个 is 会显得通俗易懂 .

IOS 关于property的详细解法的更多相关文章

  1. # ios开发 @property 和 Ivar 的区别

    ios开发 @property 和 Ivar 的区别 @property 属性其实是对成员变量的一种封装.我们先大概这样理解: @property = Ivar + setter + getter I ...

  2. yzoi2226最小步数的详细解法

    Description - 问题描述 在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”.有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字. ...

  3. unity导出工程导入到iOS原生工程中详细步骤

    一直想抽空整理一下unity原生工程导入iOS原生工程中的详细步骤.做iOS+vuforia+unity开发这么长时间了.从最初的小小白到现在的小白.中间趟过了好多的坑.也有一些的小小收货.做一个喜欢 ...

  4. MVVM 模式下iOS项目目录结构详细说明

    ➠更多技术干货请戳:听云博客 我们在做项目的时候,会经常用到各种设计模式,最常见的要数 MVC (模型,视图,控制器)了.但是,今天我们要说的是另一种设计模式——MVVM. 所以 MVVM 到底是什么 ...

  5. IOS SDK相机的详细解释/画廊(默认+他们的高清摄像头接口)

    原版的blog,转载请注明出处 blog.csdn.net/hello_hwc 前言: 新NSURLSession的UploadTask的,结果写那个Demo的时候想要写成拍照上传.然后就想到先写一个 ...

  6. (iOS)关于@property和@synthesize的理解(原创)

    开始学习ios的时候,就对一些objc的语法不理解,就比如@property和@synthesize,之前都是记住然后照着用,但是写的代码多了,对objc和ios有了一些理解,再加上最近用MRC,所以 ...

  7. IOS中@property的属性weak、nonatomic、strong、readonly等介绍

    iOS开发中@property的属性weak nonatomic strong readonly等介绍 //property:属性://synthesize:综合; @property与@synthe ...

  8. IOS Intro - Property Synthesis

    http://www.thecodecrate.com/ios/objective-c/objective-c-property-synthesize/ 01. atomic              ...

  9. 最新iOS发布App Store详细图文教程~

    网上有很多关于iOS发布上架的教程,但大多比较旧而且不完整.不够清晰.所以整理了一个详细完整的iOS APP发布上架App Store的图文教程.分享给小白到大神路上前进的你我. 上架iOS需要一个苹 ...

随机推荐

  1. 不依赖浏览器控制台的JavaScript断点调试方法

    随着浏览器的逐渐强大,绝大多数情况下的代码调试都是可以通过浏览器自带的一些调试工具进行解决.然而对于一些特殊情况仍然无法享受到浏览器的强大 调试能力,比如QQ客户端内嵌web的调试(虽然说QQ目前已经 ...

  2. 利用有限自动机(finite automata)进行模式匹配

    一.有限自动机定义及基本术语: 一个有限自动机 M 是一个5元组(Q, ,A, Σ, δ),其中: Q 是所有状态的有限集合;  ∈ Q (属于)是初始状态; A ⊆ Q (子集)是接受状态的集合; ...

  3. bootstrap实例 之 响应式表格-----2017-05-15

    Bootstrap 的响应式 CSS 能够自适应于台式机.平板电脑和手机,现在就bootstrap的响应式举一个例子: 如上图所示,要实现该表格在手机等移动端上只显示代号.名称.和价格,其他以查看详情 ...

  4. wdc网站部署问题

    最近公司新买了一个服务器,将项目迁移到新服务器上,按照wdcp安装方法,部署了lnamp环境,具体方法如下: 安装方法1 只安装wdcp面板看看wget http://down.wdlinux.cn/ ...

  5. Tensorflow中的padding操作

    转载请注明出处:http://www.cnblogs.com/willnote/p/6746668.html 图示说明 用一个3x3的网格在一个28x28的图像上做切片并移动 移动到边缘上的时候,如果 ...

  6. Natas Wargame Level 16 Writeup(Content-based Blind SQL Injection)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqwAAADhCAYAAAANm+erAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF

  7. 第一个远程javaweb项目测试全过程

    2017-5-20,在这个奇特的日子,我不再满足于在本地测试javaweb,于是在上腾讯云买了第一个云服务器,由于是学生认证,所以一个月只要10块钱,还是要抢的,每天早上9点开抢 打开后,发现其实是一 ...

  8. java面向对象--包及访问控制符

    多人开发同一个项目时,会出现类名称相同的情况.package就是为了避免类或接口名称重复而采用的一种措施.实际上包就是有一定层次结构的文件夹,*.class文件要保存当前类声明的和包对应的文件夹中. ...

  9. 开涛spring3(2.2) - IoC 容器基本原理及其helloword

    2.2.1  IoC容器的概念 IoC容器就是具有依赖注入功能的容器,IoC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需直接在代码中new相关的对象,应用程序由IoC ...

  10. unity 在安卓个IOS平台上 同一个按钮 点击后实现不同的功能

    #if UNITY_IOS UIEventListener.Get(mSprites["Recharge"].gameObject).onClick = OnIOSRecharge ...