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,) 时。我们才使用它。

Objective-C中的@Property具体解释相关推荐

  1. R语言Eta squared计算实战:Eta squared表示可以用模型中给定的变量解释的方差的比例、拟合方差分析模型(two-way ANOVA)、计算Eta Squared

    R语言Eta squared计算实战:Eta squared表示可以用模型中给定的变量解释的方差的比例.拟合方差分析模型(two-way ANOVA).计算Eta Squared 目录

  2. 通过Spring配置文件中bean中的property赋值

    基本数据类型赋值-通过spring配置文件中bean中的property 扩展-以此方式可以通过配置为连接数据的属性赋值 1.如果是基本数据类型,可以通过setter方法为对象中的属性设置初始值,应用 ...

  3. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  4. Action中五个常量解释,(success,error,input,login,none)

    Action中五个常量解释,(success,error,input,login,none) 英文注释 中文释义 staticString ERROR The actionexecution was ...

  5. 计算机里多媒体的名词解释,多媒体技术中的常见名词解释 众德伟业

    原标题:多媒体技术中的常见名词解释 众德伟业 显示缓冲区与颜色定义.对于计算机显示系统来说,它有两种显示模式:字母数字模式(A1pha Number Mode)和图形模式(Graphics Mode) ...

  6. Oracle 中control_file_record_keep_time参数的解释

    Oracle基于RMAN的备份方式,可分为以catalog 和nocatalog的两种方式进行备份管理.其中,catalog的方式需要一个catalog目录数据库,这个数据库一般运行在另外一台服务器上 ...

  7. mysql5.7命中率_MySQL5.7中 performance和sys schema中的监控参数解释(推荐)

    1.performance schema:介绍 在mysql5.7中,performance schema有很大改进,包括引入大量新加入的监控项.降低占用空间和负载,以及通过新的sys schema机 ...

  8. 英语中的介词详细解释

    英语中的介词详细解释 xixi2015-01-05 10:02:58 转载于:https://www.cnblogs.com/lyhabctranslate/p/4202991.html

  9. C#中static void Main(string[ ] args)中的作用及解释

    C#中static void Main(string[ ] args)中的作用及解释 static 表示方法是静态的就是说方法在程序被编译的时候就被分配了内存,使用的时候不用生成某个类型的对象,知道程 ...

  10. Python中的property类和@property装饰器

    Python中的property类和@property装饰器 在Python的类中,为了避免使用者直接在类的外部操作属性和方法,我们可以将属性和方法设置成私有属性和私有方法. 如果我们需要访问私有属性 ...

最新文章

  1. 点分治问题 ----------- HDU6881 Tree Cutting or 2020杭电多校第10场 [点分治+思维]
  2. C语言宏定义、宏替换
  3. Matlab绘图--包含各种标示符的输入方法
  4. 【MySQL】基于Docker的Mysql主从复制搭建
  5. 【Python】pandas模块操作大型数据集
  6. PHP CodeBase: 求最近一个周一和上周一的日期
  7. 关于GaussDB(DWS)的正则表达式知多少?人人都能看得懂的详解来了!
  8. Python实战之多线程编程threading.Thread
  9. iOS网络编程--ASIHTTPRequest框架安装和配置-图文解说
  10. unity调用php,unity访问php
  11. 4399ATAPI讲解用例配置篇
  12. python的小tips
  13. 我今天人品大爆发啊,赚了299美元
  14. 青龙BOT机器人交互
  15. 【Oracle】学习笔记(五)高级查询
  16. XMail 安装配置使用 (1.27 )
  17. 美国区块链公司Espresso Systems因涉嫌知识产权盗窃被起诉
  18. 开发过程中的算法小技巧:
  19. mysql求班级男女比例_学校班级队形上看,男女比例严重失调,网友:这以后讨老婆有难度...
  20. 7-3 字符串替换 (10分)(Java,超长字符串替换创建快速输入流)

热门文章

  1. nginx+php fpm日志报错信息
  2. java类加载器和父类委托机制
  3. NOD32 AntiVirus v2.70.16杀毒软件
  4. mysql 最小值对应的其他属性_查询最小值对应的非group by字段
  5. preempt_count
  6. Android 四大组件学习之Activity七
  7. 传输层协议(13):拥塞控制(2)
  8. PowerPC L2-Cache Sram
  9. 我所认识的EXT2(二)
  10. 内核调试神器SystemTap — 探测点与语法(二)