Objective-C中的@Property具体解释
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具体解释的更多相关文章
- objective c, category 和 protocol 中添加property
property的本质是实例变量 + getter 和 setter 方法 category和protocol可以添加方法 category 和 protocol中可以添加@property 关键字 ...
- JavaScript中的property和attribute
property,attribute都作“属性”解,但是attribute更强调区别于其他事物的特质/特性. 而在JavaScript中,property和attribute更是有明显的区别.众所周知 ...
- js中的property和attribute
javascript中的property和attribute虽然都被翻译为“属性”,但是他们还是有区别的. 前两天写网页时用到checkbox,就被property和attribute弄晕了好久.后来 ...
- OC中的@property详解
简介: @property 生成了变量的get set 方法,同时指定了变量名称. 例如@property (nonatomic,strong) NSString *name;表示生成了_name私有 ...
- Objective-C中的@property和@synthesize用法
@代表“Objective-C”的标志,证明您正在使用Objective-C语言 Objective-C语言关键词,@property与@synthesize配对使用. 功能:让编译好器自动编写一个与 ...
- 理解Objective C 中id
什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- Objective-C中的@property
1:@property 是什么? 在Objective-C中,@property 是声明属性的语法,它可以快速方便的为实例变量创建getter/setter方法. 2:@property 的本质? @ ...
- Objective-C中的@Property详解
Objective-C中的@Property详解 @Property (属性) class vairs 这个属性有nonatomic, strong, weak, retain, copy等等 我把它 ...
随机推荐
- java根据经纬度获取地址
public class GetLocation { public static void main(String[] args) { // lat 39.97646 //log 116.3039 S ...
- Android实现图片轮显效果——自定义ViewPager控件
一.问题概述 使用ViewPager控件实现可横向翻页.水平切换图片等效果,但ViewPager需要手动滑动才能切换页面,图片轮显效果的效果本质上就是在ViewPager控件的基础上让它能自动的进行切 ...
- 如何在模板中引用参数类中的一个特定member
C++模板有很多特性需要我们去挖掘,很多新的设计模式也都与模板使用相关,我们知道模板的一个基本特性就是可以根据传入的类型产生新的类型.围绕这个特性,可以衍生出很多的其它特性,比如自动为不同的类生成st ...
- zypper命令使用示例
导读 Zypper是OpenSUSE和企业版SUSE中软件包管理器ZYpp的命令行接口. 主要用于:1.管理软件包:zypper可用来安装.删除.更新和查询本地或远程的软件包.2.管理仓库:zyppe ...
- select2插件替换掉数据列表为空时候的No results found的提示
$(".select2").select2({ language: { noResults: function (params) { return "暂无数据" ...
- Javascript高级程序设计-对象
学习Javascript,最难的地方是什么? Object(对象)最难,初学者不容易掌握. Javascript是一种基于对象(object-based)的语言,它的语法中没有class(类). C# ...
- An Easy Task(简箪题)
B. An Easy Task Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO f ...
- 使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener
使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener在平时的单元测试,如果不使用RunWith注解,那么JUnit将会采用默认的执行类Suite执行,如下类: public ...
- 'htmlentities(): charset `utf8' not supported, assuming utf-8'
TP5.1框架报错! Fatal error: Uncaught exception 'think\exception\ErrorException' with message 'htmlentit ...
- 通过Shell命令与JavaAPI读取ElasticSearch数据 (能力工场小马哥)
主要内容: 通过JavaAPI和Shell命令两种方式操作ES集群 集群环境: 两个 1,未配置集群名称的单节点(模拟学习测试环境); 2,两个节点的集群(模拟正常生产环境). JDK8+Elasti ...