Objective-C中的@Property具体解释

@Property (属性) class vairs

这个属性有nonatomic。 strong。 weak, retain。 copy等等

我把它们分为三类,各自是:原子性。存取器控制,内存管理。

原子性

  • atomic(默认):atomic意为操作是原子的,意味着仅仅有一个线程訪问实例变量。atomic是线程安全的。至少在当前的存取器上是安全的。

    它是一个默认的特性,可是非常少使用,由于比較影响效率,这跟ARM平台和内部锁机制有关。

  • nonatomic:nonatomic跟atomic刚好相反。表示非原子的,能够被多个线程訪问。它的效率比atomic快。但不能保证在多线程环境下的安全性,在单线程和明白仅仅有一个线程訪问的情况下广泛使用。

存取器控制

  • readwrite(默认):readwrite是默认值。表示该属性同一时候拥有setter和getter。
  • readonly: readonly表示仅仅有getter没有setter。

有时候为了语意更明白可能须要自己定义訪问器的名字:

@property (nonatomic, setter = mySetter:,getter = myGetter ) NSString *name;

最常见的是BOOL类型。比方标识View是否隐藏的属性hidden。能够这样声明:

@property (nonatomic,getter = isHidden ) BOOL hidden;

内存管理

@property有显示的内存管理策略。这使得我们仅仅须要看一眼@property声明就明白它会如何对待传入的值。

assign

assign(默认):assign用于值类型。如int、float、double和NSInteger。CGFloat等表示单纯的复制。

还包含不存在全部权关系的对象,比方常见的delegate。

@property(nonatomic) int running;

@property(nonatomic,assign) int running;

以上两段代码是同样的。

在setter方法中,採用直接赋值来实现设值操作:

-(void)setRunning:(int)newRunning{
_running = newRunning;
}

retian

retian:在setter方法中,须要对传入的对象进行引用计数加1的操作。

简单来说,就是对传入的对象拥有全部权,仅仅要对该对象拥有全部权,该对象就不会被释放。

例如以下代码所看到的:

-(void)setName:(NSString*)_name{
//首先推断是否与旧对象一致,假设不一致进行赋值。
//由于假设是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时。使此次的set操作让实例name提前释放。而达不到赋值目的。 if ( name != _name){
[name release];
name = [_name retain];
}
}

copy

copy:在setter方法中,首先复制传入的參数。然后将原来的旧值release。新的数值复制上去。

 -(void)setName:(NSString*)newName{

    if(newName!=name){
[name release];
name=[newName copy];
}
}

注意:Foundation中可复制的对象,当我们copy的是一个不可变的对象的时候。它的作用相当与retain(cocoa做的内存优化)比方我们对NSString进行copy,copy得到的地址是不变的。

以下四段代码中,第一段显示的结果不会copy,而是retain.

    NSLog(@"====================================================================================");
NSString *sstr = [NSString stringWithFormat:@"dfa"];
NSLog(@"strassign:%p, count:%ld", sstr , [sstr retainCount]);
NSString *sstr2 = [sstr copy];
NSLog(@"strassign:%p, count:%ld", sstr2 , [sstr2 retainCount]);
NSLog(@"===================================================================================="); NSLog(@"====================================================================================");
NSString *sstr = [NSString stringWithFormat:@"dfa"];
NSLog(@"strassign:%p, count:%ld", sstr , [sstr retainCount]);
NSString *sstr2 = [sstr mutableCopy];
NSLog(@"strassign:%p, count:%ld", sstr2 , [sstr2 retainCount]);
NSLog(@"===================================================================================="); NSLog(@"====================================================================================");
NSMutableString *str = [NSMutableString stringWithFormat:@"dfa"];
NSLog(@"strassign:%p, count:%ld", str , [str retainCount]);
NSMutableString *str2 = [str copy];
NSLog(@"strassign:%p, count:%ld", str2 , [str2 retainCount]);
NSLog(@"===================================================================================="); NSLog(@"====================================================================================");
NSMutableString *str = [NSMutableString stringWithFormat:@"dfa"];
NSLog(@"strassign:%p, count:%ld", str , [str retainCount]);
NSMutableString *str2 = [str mutableCopy];
NSLog(@"strassign:%p, count:%ld", str2 , [str2 retainCount]);
NSLog(@"====================================================================================");

strong

strong:strong是在IOS引入ARC的时候引入的关键字,是retain的一个可选的替代。表示实例变量对传入的对象要有全部权关系。即强引用。strong跟retain的意思同样并产生同样的代码。可是语意上更好更能体现对象的关系。

weak

weak:在setter方法中。须要对传入的对象不进行引用计数加1的操作,和assign类似。

简单来说,就是对传入的对象没有全部权,当该对象引用计数为0时,即该对象被释放后。用weak声明的实例变量指向nil,即实例变量的值为0。

强引用(strong)和弱引用(weak)的一个笑话(便于理解)

把对象想象成一条狗,它要跑 (be deallocated)。强指针就像一条拴在狗脖子上的狗链。仅仅要攥在手里。狗就跑不了。假设5个人攥着5条狗链都拴着狗 (5个强指针指向对象),除非5条狗链都撒开,狗就跑不了。

弱指针就像是孩子指着狗喊“看!

狗!

”。仅仅要狗链还拴着狗,孩子就能指着狗喊。

当全部狗链都撒开,无论有多少孩子指着狗喊。狗都跑了。当最后一个强指针不再指向对象,对象就会被释放,全部弱指针清零。我们什么时候使用弱指针呢?仅仅有当你想避免保留循环 (retain cycles,) 时。我们才使用它。

最新文章

  1. vue data对象添加新属性触发视图
  2. Excel应该这么玩——4、命名区域:搞定下拉框
  3. js处理iframe中子页面与父页面里面对象的取得的解决方案
  4. paypal之nodejs 框架 Kraken-js 源码分析
  5. BeanUtils.copyProperties() 用法--部分转
  6. Ehcache入门(一)——开发环境的搭建
  7. PHP curl 模拟登陆
  8. swift 进阶笔记 (一) —— 可选型
  9. jdk之String
  10. es6中对象的类与继承方法
  11. oracle PL/SQL语法基础
  12. 树和二叉树的存储结构的实现(C/C++实现)
  13. CentOS7终端的分辨率和字体修改
  14. .NET Core玩转机器学习
  15. [官网]Using PuTTY
  16. Xilinx Vivado的使用详细介绍(4):Zedboard+vivado之流水灯(加SDK)
  17. wordpress 解决文章内http链接问题
  18. Linux 安装 RabbitMQ 3.7.8 安装部署
  19. Scrapy框架学习笔记
  20. Java对文件的读取方式以及它们的优缺点

热门文章

  1. scala 学习笔记三 闭包
  2. Oracle中的数值处理方法
  3. 【Hadoop】mapreduce采用多进程与spark采用多线程比较
  4. 盘点linux系统中的12条性能调优命令。
  5. rmdir 命令(转)
  6. Spring AOP深入理解之拦截器调用
  7. ubuntu中设置xampp开机启动
  8. A链接IE6、7下失效场景及解决方案
  9. Jsp和session、request.getSession()
  10. set names utf8 【mysql导入中文乱码问题解决】