@synthesize obj=_obj的意义详解 @property和@synthesize

本文转载至:http://blog.csdn.net/showhilllee/article/details/8971159
我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一个比较基本的问题,也关乎我们理解Objective-C中对类、类的属性、类的存取器、类的局部变量的统一理解。
在32位系统中,如果类的 @interface 部分没有进行 ivar 声明,但有 @property 声明,在类的 @implementation 部分有响应的 @synthesize,则会得到类似下面的编译错误:
Synthesized property 'xX' must either be named the same as a compatible ivar or must explicitly name an ivar
在 64-bit时,运行时系统会自动给类添加 ivar,添加的 ivar 以一个下划线"_"做前缀。
上面声明部分的 @synthesize window=_window; 意思是说,window 属性为 _window 实例变量合成访问器方法。
也就是说,window属性生成存取方法是setWindow,这个setWindow方法就是_window变量的存取方法,它操作的就是_window这个变量。通过这个看似是赋值的这样一个操作,我们可以在@synthesize 中定义与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问。

下面是一个常见的例子
写法一:
C代码  收藏代码

@interface MyClass:NSObject{    

        MyObjecct *_myObject;  

}  

@property(nonamtic, retain) MyObjecct *myObject;  

@end  

  

@implementatin MyClass  

@synthesize myObject=_myObject;  

 
写法二:
C代码  收藏代码

@interface MyClass:NSObject{  

        

}  

@property(nonamtic, retain) MyObjecct *myObject;  

@end  

  

@implementatin MyClass  

@synthesize myObject=_myObject;  

 
这个类中声明了一个变量_myObject,又声明了一个属性叫myObject,然后用@synthesize生成了属性myObject的存取方法,这个存取方法的名字应该是:setmyObject和getmyObject。@synthesize myObject=_myObject的含义就是属性myObject的存取方法是做用于_myObject这个变量的。这种用法在Apple的Sample Code中很常见。
弄明白了这个语句的意思之后,我们也就清楚了myObject和_myObject的区别,那么,在使用的时候,有什么需要注意的地方,大家应该也都清楚了。是的,myObject是属性,而_ myObject才是变量,我们最终操作的变量都是myObject。
那么,同样是存取操作,语句
C代码  收藏代码

self.nameVarPtr = [[ObjectName alloc] init]   

C代码  收藏代码

nameVarPtr = [[ObjectName alloc] init]  

两种赋值方式的区别何在呢?

 

self.nameVarPtr=xxx 这种赋值方式等价于调用 [self setnameVarPtr:xxx], 而setnameVarPtr:xxx的方法的实现又是依赖于@property的属性的,比如retain,assign等属性。

 

nameVarPtr = xxx 的赋值方式,仅仅是对一个指针进行赋值。nameVarPtr仅仅是一个指针变量,记录了xxx的地址。在这个过程中不会调用setter方法,不会调用setter方法,就和@property没有关系,从而,也和retain,assign等属性没有关系。这种赋值方式就是一个简单的指针赋值。

 

综上,对成员变量进行赋值,为防内存泄露需要注意的点:

1.self调用setter方法的方式

ObjectName*  tmp= [[ObjectName alloc] init];

self.nameVarPtr =tmp;                 //retainCount=2

[tmp release];                               //retainCount=1

 

2.指针赋值方式,不会调用setter方法

nameVarPtr= [[ObjectName alloc] init]; // retainCount=1

 

所以,笔者建议大家在对某个变量进行赋值操作的时候,尽量要写self.myObj = xxx; 这才是最可靠的方法。

@property和@synthesize可以自动生成某个类成员变量的存取方法

readwrite:这个属性是默认的情况,会自动为你生成存取器

assign:这个属性一般用来处理基础类型,比如int、float等等,如果你声明的属性是基础类型的话,assign是默认的,你可以不加这个属性

natomic:默认是有该属性的,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题

readonly:只生成getter不会有setter方法

copy:这个会自动生成你赋值对象的克隆,相当于在内存中新生成了该对象的副本,这样一来,改变赋值对象就不会改变你声明的这个成员变量了

retain:会自动retain赋值对象

nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率

http://blog.csdn.net/beautifularea/article/details/6886604

 assign:指定setter方法用简单的赋值,这是默认操作。你可以对标量类型(如int)使用这个属性。你可以想象一个float,它不是一个对象,所以它不能retain、copy。

 assign:简单赋值,不更改索引计数(Reference Counting).使用assign: 对基础数据类型 (NSInteger)和C数据类型(int, float, double, char,等)

 retain:指定retain应该在后面的对象上调用,前一个值发送一条release消息。你可以想象一个NSString实例,它是一个对象,而且你可能想要retain它。

 

 retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 ,使用retain: 对其他NSObject和其子类 ,retain,是说明该属性在赋值的时候,先release之前的值,然后再赋新值给属性,引用再加1。

 

 copy:指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。copy:建立一个索引计数为1的对象,然后释放旧对象,copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。

readonly:将只生成getter方法而不生成setter方法(getter方法没有get前缀)

readwrite:默认属性,将生成不带额外参数的getter和setter方法(setter方法只有一个参数)

atomic:对于对象的默认属性,就是setter/getter生成的方法是一个原子操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter的情况,相关于方法头尾加了锁一样。

 

nonatomic:不保证setter/getter的原子性,多线程情况下数据可能会有问题。nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。先释放原先变量,再将新变量     retain然后赋值;

      注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。

http://blog.sina.com.cn/s/articlelist_1605247797_0_1.html

转载于:https://www.cnblogs.com/Camier-myNiuer/p/3399317.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我喜欢的一首歌--《幸福的瞬间》

看了《薰衣草》就开始喜欢这首歌了,看的时候还会为了电视里男女主角痴情的爱情故事落泪,可见我还不成熟。今天正当我和下班人群一起在572上被挤得快变形的时候,车厢里放起了这首歌,我差点以为是我的手机响了。(呵呵&am…

react学习(42)----react中的jsx表达对象

JSX 表示对象 Babel 会把 JSX 转译成一个名为 React.createElement() 函数调用。 以下两种示例代码完全等效&#xff1a; const element (<h1 className"greeting">Hello, world!</h1> ); const element React.createElement(h1,{className: greet…

react学习(43)----react中将一个元素渲染为 DOM

假设你的 HTML 文件某处有一个 <div>&#xff1a; <div id"root"></div> 我们将其称为“根” DOM 节点&#xff0c;因为该节点内的所有内容都将由 React DOM 管理。 仅使用 React 构建的应用通常只有单一的根 DOM 节点。如果你在将 React 集成进…

win7 IIS7.5配置伪静态

第一部: 从如下地址中下载URLRewriter组件组件&#xff1a;官方下载地址&#xff1a;http://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi第二部&#xff1a;在网站项目中添加URLRewriter程序集的引用。第三部&#xff1…

Github项目推荐|可视化 GAN 的训练过程

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 137 篇文章&#xff0c;本文大约 1000 字&#xff0c;阅读大约需要 5 分钟今天介绍的一个开源的 github 项目&#xff0c;主要是实现了对 GAN 训练过程的可视化代码&#xff0c;项目链…

学习计划

自己也算是一个老程序员了&#xff0c;但是毕业后一直没有系统的学习编程&#xff0c;自己感觉现在的技术乱七八糟、支离破碎的&#xff0c;因此决定从现在开始有计划地学习一些实用的技术&#xff1a;1、客户端&#xff1a;javascript、html、css、dhtml等&#xff1b;2、服务…

Github|类别不平衡学习资源(上)

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 138 篇文章&#xff0c;本文大约 5400 字&#xff0c;阅读大约需要 15 分钟今天推荐的是一个 github 项目&#xff0c;项目地址如下&#xff0c;主要是类别不平衡学习的论文、代码、框…

XForum 里用 Filter 编程实现安全访问控制

J2EE/EJB 论坛 / XForum 里用 Filter 编程实现安全访问控制cinc 2003.03.11&#xff0c; 15个回复&#xff0c; 1745次浏览在 J2ee 里&#xff0c;实现安全有两种&#xff1a; 用声明实现安全&#xff0c;就是在 web.xml 里实现安全限制。 用编程实现安全&#xff0c;自己写代码…

进制转换,写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。 数据范围:保证结果在 1≤n≤2的31次方-1

题目&#xff1a;进制转换 写出一个程序&#xff0c;接受一个十六进制的数&#xff0c;输出该数值的十进制表示。 数据范围&#xff1a;保证结果在 1≤n≤2的31次方-1 代码实现&#xff1a; import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 p…

Github|类别不平衡学习资源(下)

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 139 篇文章&#xff0c;本文大约 3600 字&#xff0c;阅读大约需要 10 分钟继续介绍类别不平衡学习资源&#xff0c;github 地址&#xff1a;https://github.com/ZhiningLiu1998/awes…

react学习(45)----react组件

定义组件最简单的方式就是编写 JavaScript 函数&#xff1a; function Welcome(props) {return <h1>Hello, {props.name}</h1>; } 该函数是一个有效的 React 组件&#xff0c;因为它接收唯一带有数据的 “props”&#xff08;代表属性&#xff09;对象与并返回一…

Github | 线稿自动上色

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 140 篇文章&#xff0c;本文大约 1500 字&#xff0c;阅读大约需要 5 分钟今天要介绍的是一个 Github 项目&#xff0c;项目地址如下&#xff0c;它实现了对线稿的自动上色功能&#…

react学习(46)----react渲染组件

const element <div />; 不过&#xff0c;React 元素也可以是用户自定义的组件&#xff1a; const element <Welcome name"Sara" />; 当 React 元素为用户自定义组件时&#xff0c;它会将 JSX 所接收的属性&#xff08;attributes&#xff09;以及子…

Microsoft好员工的十个标准

1、对自己所在公司或部门的产品具有起码的好奇心是极为重要的一点。你必须亲自使用该产品。对于身处计算机行业的人来说,这一点怎么强调都不为过。当然&#xff0c;这一点同样适用于其他知识密集型领域&#xff0c;因为在这些领域内技术与应用发展更新极快&#xff0c;对其技术…

如何在图片上添加文本信息

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 141 篇文章&#xff0c;本文大约 1500 字&#xff0c;阅读大约需要 5 分钟前言给图片添加文本信息是非常常见的需求&#xff0c;通常需要添加的文本信息分为中文文字或者是非中文的文…

react学习(47)----react中initialValue和value不能一起定义

<Row gutter{12}><Col span{12}><Form.Item label"活动开始时间">{getFieldDecorator(startTimeLong, {initialValue: popupByIdDetail.startTimeLong,rules: [{ required: true, message: 活动开始时间不能为空 }],})(<DatePickervalue{popupB…

Github|基于 Jittor 的 GAN 模型库

点击上方“算法猿的成长“&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶”总第 142 篇文章&#xff0c;本文大约 1300 字&#xff0c;阅读大约需要 5 分钟前言今天介绍一个 Github 项目---集成了 27 种 GAN 模型的 Jittor-GAN&#xff0c;项目地址&#xff1a;htt…