《iOS应用程序开发方法与实践》答疑-关于对象创建、self、成员变量与属性
来源:互联网 发布:单片机触摸屏控制 编辑:程序博客网 时间:2024/05/17 04:23
转载自:http://blog.csdn.net/pucker/article/details/32129387
有很多读者跟我说,他们在self、访问类的成员变量(variable)以及调用类的属性(property)时遇到了问题,因此我打算在此详细解释一下。
一、对象的内存分配与初始化
我们首先要定义类,然后才能创建类的对象并使用它们。但是对象在创建和使用之前,要经过内存分配(Memory Allocation)与初始化(Initialization)两个过程。内存分配是指应用程序向操作系统申请一段内存空间,用来保存对象的所有成员变量的值。而初始化则是指对象在使用之前将其成员变量的值置为正确的初始值。
为了说明上述两个过程的作用,我们先看一下下面的例子:
- @interface BaseClass : NSObject
- {
- int _baseIntVar;
- }
- @end
- @interface SubClass : BaseClass
- {
- int _subIntVar;
- }
- @end
这里定义了BaseClass和SubClass两个类,其中BaseClass继承自NSObject类,而SubClass继承自BaseClass类。当需要创建SubClass类的对象时,我们一般都会这么写:
- SubClass* newSub = [[SubClass alloc] init];
这里以串接的方式,连续调用了alloc与init方法。其中alloc方法是NSObject类中定义的一个静态方法:
- @interface NSObject <nsobject>
- {
- Class isa;
- }
- + (id)alloc;
- ...
- @end
alloc方法用于实现对象的内存分配,它能够计算出对象需要的内存空间大小,然后向操作系统申请内存并将得到的内存空间全部清零,最后返回内存空间的首地址。对于上面的例子,当为SubClass对象分配内存时,由于类的继承关系,alloc方法会向操作系统申请一块包含isa、_baseIntVar与_subIntVar的内存空间,其中isa指向SubClass类对象,其余成员变量均为0,最后返回内存空间的首地址。内存清零的意思是指,对于类的成员变量,int类型为0,float、double为0.0,BOOL类型为NO,对象指针为nil。
init是默认的初始化方法,我们也可以自己定义初始化方法为成员变量赋初值,例如:
- @implementation SubClass
- - (id)init
- {
- self = [super init];
- if (self)
- {
- _subIntVar = 1;
- }
- return self;
- }
- @end
这里定义了子类SubClass的初始化方法init。其中第一句:
- self = [super init];
你可能觉得奇怪,为什么要将基类初始化方法的返回值赋值给self?这是因为基类的初始化方法有可能会返回另外一个对象的地址,而不是当初调用init方法的对象地址。所以我们在创建对象的时候,不应该把alloc语句与init语句分开,必须串接起来。
- SubClass* newSub = [[SubClass alloc] init]; //正确
- //SubClass* newSub = [SubClass alloc];
- //[newSub init]; //错误,init方法有可能返回另一个地址
二、关于self
未完待续。。。
- 《iOS应用程序开发方法与实践》答疑-关于对象创建、self、成员变量与属性
- 《iOS应用程序开发方法与实践》答疑-关于对象创建、self、成员变量与属性
- iOS开发 -- 属性与成员变量
- ios 关于成员变量与属性的区别
- iOS 开发中成员变量与属性的区别
- ios 属性与成员变量的区别
- ios--成员变量与属性的区别
- iOS 成员变量与属性的区别
- iOS开发中文教程(教材):《iOS应用程序开发方法与实践》配套源代码与勘误表
- iOS开发中文教程(教材):《iOS应用程序开发方法与实践》内容简介与目录
- 成员变量与方法变量
- 《iOS应用程序开发方法与实践》补充内容-2.13 再谈类的声明与实现
- 3.1.类与对象,成员变量与方法
- 【转】iOS中属性与成员变量的区别
- IOS中属性与成员变量的区别
- iOS中属性与成员变量的区别
- iOS中属性与成员变量的区别
- iOS中属性与成员变量的区别
- 1.windows技巧-开机规避自动打开go_miscrosoft网站
- Java事务的深入理解 JAT
- android studio 快捷键
- Python3学习笔记02
- XMPP客户端库Smack 4.1.4版官方开发文档之八
- 《iOS应用程序开发方法与实践》答疑-关于对象创建、self、成员变量与属性
- char *s="string"和char s[]="string"的区别
- iOS应用架构谈 view层的组织和调用方案
- [转]android手机连接mac调试
- legit命令
- 天空盒和相机
- 计算机的原码, 反码和补码
- Mac下解压Android NDK
- android:windowSoftInputMode