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. OC中的@property详解

    简介: @property 生成了变量的get set 方法,同时指定了变量名称. 例如@property (nonatomic,strong) NSString *name;表示生成了_name私有 ...

  2. (转)javascript中event对象详解

    原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解          博客分类: javaScript JavaScriptCS ...

  3. iOS中—触摸事件详解及使用

    iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...

  4. C#中的Attribute详解(下)

    原文地址:https://blog.csdn.net/xiaouncle/article/details/70229119 C#中的Attribute详解(下) 一.Attribute本质 从上篇里我 ...

  5. angularJS中$apply()方法详解

    这篇文章主要介绍了angularJS中$apply()方法详解,需要的朋友可以参考下   对于一个在前端属于纯新手的我来说,Javascript都还是一知半解,要想直接上手angular JS,遇到的 ...

  6. wpf中的触发器详解 (转自 乂乂的日志 - 网易博客)

    2010-03-24 16:19:07|  分类: WPF相关 |  标签: |字号大中小 订阅     wpf中的触发器详解 WPF/C# 2009-08-24 11:32:50 7.1.2  简单 ...

  7. IOS中UITableViewCell使用详解

    IOS中UITableViewCell使用详解 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(N ...

  8. spring在IoC容器中装配Bean详解

    1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean ...

  9. Spring Boot中@ConditionalOnProperty使用详解

    在Spring Boot的自动配置中经常看到@ConditionalOnProperty注解的使用,本篇文章带大家来了解一下该注解的功能. Spring Boot中的使用 在Spring Boot的源 ...

随机推荐

  1. Python中lstrip使用心得

    lstrip方法用来去除字符串从首位开始与之相匹配的字符.例如: a = 'c' b = 'calendar' print(b.lstrip(a)) 输出结果是 'alendar'. 之前我也一直是这 ...

  2. bzoj 1067: [SCOI2007]降雨量 模擬

    1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2010  Solved: 503[Submit][Status] ...

  3. The Model Complexity Myth

    The Model Complexity Myth (or, Yes You Can Fit Models With More Parameters Than Data Points) An oft- ...

  4. Remove highlight from document(Aspose Word 删除高亮)

    Thanks for your inquiry. You can do it using DocumentVisitor. Please try using the following code: / ...

  5. leetcode面试准备:Summary Ranges

    1 题目 Given a sorted integer array without duplicates, return the summary of its ranges. For example, ...

  6. TCP/IP 目录导航

    用了近二十天的时间,把一本800页的书看完,感觉收获还是很大的.对网络,对这些协议有了深刻的认识! 知道了路由器与交换机的区别. 知道了IP地址的特点. 知道了网络的分层,物理层,数据链路层,网络层, ...

  7. bzoj1954 poj3764

    对于xor有一个非常重要的性质A xor B xor B=A 并且满足交换律和结合律这道题是求无根树上最长的xor路径我们知道,无根树的题目我们都是要想办法转化为有根树来处理当我们确定了一个根,根到每 ...

  8. UnderStand Perspective Rasterization, SV_POSITION(gl_FragCoord) to Pixel, SV mean Systems Value

    Shader "UnderStandPRR" { Properties { _MainTex ("Texture", 2D) = "white&quo ...

  9. 关于响应事件中的Sender

    很多响应事件都会有个参数就是Sender,如下: - (IBAction)updateSliderValue:(id)sender Sender其实就是触发响应的那个实例对象,比如这个消息是由一个UI ...

  10. cocos2d的安装

    安装cocos2d其实就是在Xcode中安装几个模板,然后在Xcode里面就可以直接使用这些模板了. 其实说是模板,也就是封装了许许多多引擎的文件,相对于原生的程序,也许使用引擎模板更加方便.   下 ...