@synthesize obj = _obj 理解
在很多代码里可以看到类似得用法:
@interface MyClass:NSObject{
MyObjecct *_object;
}
@property(nonamtic, retain) MyObjecct *object;
@end
@implementatin MyClass
@synthesize object=_object;
(1)32位系统和64位系统的差异
在32位系统中,如果类的@interface部分没有进行ivar(instance variable)声明,但有@property声明,在类的@implementation部分有响应的@synthesize,则会得到类似下面的编译错误:
Synthesize property ‘xX’ must either be named the same as a compatible ivar or must explicitly name an ivar
在64位系统中,运行时系统会自动给类添加ivar,添加的ivar以一个下划线“_”做前缀。
(2)避免莫名其妙的Bug
在这里简单说一下_object和object的区别。_object是MyClass类的成员变量,object是属性。property和synthesize定义了一对getter和setter方法,在这里的getter方法是object,setter方法是setObject,事实上getter和setter方法操作的是变量_object。
如果写synthesize objec = _object 时getter方法为:
-(MyObject *)object
{
return _object;
}
如果写synthesize object 时getter方法为:
-(MyObject *)object
{
return object;
}
当函数名和属性名重名的时候会出现意想不到的错误,为了避免这种Bug,Apple给的Demo Code里面多数也采用这种方式。
(3)属性和变量的用法
属性是用self.object,通过getter方法来调用的,可以在类外使用。而变量是通过_object来调用,只能在该类对应的implementation中使用,在类外不能使用。
下面看一下两种赋值操作:
self.object = [[MyObject alloc] init];
_object = [[MyObject alloc] init];
第一种的方式和@property(nonamtic,retain)有关,实际上是通过调用setter方法setObject来实现赋值的。第二种方式是简单的指针赋值,没有调用setter方法。
下面是retainCount的变化:
MyObject *tmp = [[MyObject alloc] init];
self.object = tmp; //retainCount = 2
[tmp release]; //retainCount = 1
_object = [[MyObject alloc] init]; //retainCount = 1
@synthesize obj = _obj 理解的更多相关文章
- iOS开发中常见的语句@synthesize obj = _obj 的意义详解
我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...
- @synthesize obj=_obj的意义详解 @property和@synthesize
本文转载至 http://blog.csdn.net/ztp800201/article/details/9231969 http://hi.baidu.com/feng20068123/item/c ...
- File类--System.out.print(Object obj)的理解
一.File 类(java.io) 概述:Java中使用File类来表示文件或者文件夹对象! 抽象路径名:描述文件或文件夹时,使用的路径符号,就是一个对象的字符串表示形式,如"c:\ ...
- ArrayList集合--关于System.out.print(Object obj);的理解
1.ArrayList集合中常用的方法 ArrayList<Student> stuArrayList = new ArrayList<>(); //定义一个集合对象 stuA ...
- iOS开发中常见的语句@synthesize obj=obj的意义详解
我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...
- @property、@synthesize和dynamic的用法
原文: http://blog.csdn.net/hherima/article/details/8622948 @代表“Objective-C”的标志,证明您正在使用Objective-C语言 O ...
- NSCopying协议和copy方法
不是所有的对象都支持 copy需要继承NSCopying 协议(实现 copyWithZone: 方法)同样,需要继承NSMutableCopying 协议才可以使用mutableCopy(实现 mu ...
- 深入理解 Object.defineProperty 及实现数据双向绑定
Object.defineProperty() 和 Proxy 对象,都可以用来对数据的劫持操作.何为数据劫持呢?就是在我们访问或者修改某个对象的某个属性的时候,通过一段代码进行拦截行为,然后进行额外 ...
- 理论与实践中的 C# 内存模型,第 2 部分
转载自:https://msdn.microsoft.com/zh-cn/magazine/jj883956.aspx 这是介绍 C# 内存模型的系列文章的第二篇(共两篇). 正如在 MSDN 杂志十 ...
随机推荐
- jquery节点操作
很久没有jquery写东西了,最近使用jquery的时候发现很多节点的操作都不太熟悉了,于是就进行了一个小小的总结. 创建节点:var dom=$('<div></div>') ...
- Fragment中调用Activity的UI
1:Fragment内定义一个接口,或外部定义一个接口, 2:Fragment定义一个接口对象的属性 3:Activity实现这个接口 4:Fragment的onAttach方法中强转Activity ...
- 在JSP页面下使用AJAX实现用户名存在的检测
<script type="text/javascript"> function init(){ document.getElementById ...
- hihoCoder#1055 : 刷油漆 (树形DP+01背包)
题目大意:给一棵带点权的树,现在要从根节点开始选出m个连通的节点,使总权值最大. 题目分析:定义状态dp(u,m)表示在以u为根的子树从根节点开始选出m个点连通的最大总权值,则dp(u,m)=max( ...
- 【JZOI2002】【BZOJ1477】【P1371】青蛙的约会
看lzx的模板才写出来的,我之前的思路好想错了 chad_orz 原题: 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝着对方 ...
- windows环境下安装python模块大招
python发展到今天,感觉版本有点控制不住了,同时出现多个版本python2.5,python2.7 python 3 ,同时跨越windows,mac,*inux等多个平台,还有32位,64位等不 ...
- OCR文字识别软件 怎么识别包含非常规符号的文本
ABBYY FineReader 12 是一款OCR图文识别软件,可快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索的文本,有时文本中可能会包含一些非常规的符号,此时ABBYY ...
- SQL存储过程相关信息查看转
原文地址:http://www.cnblogs.com/minideas/archive/2009/10/29/1591891.html --1.查看所有存储过程与函数 exec sp_ ...
- 虚拟化之vmware-网络
http://blog.sina.com.cn/s/blog_6b89db7a01012jtw.htmlESXI 5.0 虚拟机的网络适配器兼容性列表 就需要在vSphere标准交换机(vSphere ...
- 关于getClass().getClassLoader()
关于getClass().getClassLoader() InputStream is = getClass().getClassLoader().getResourceAsStre ...