《iOS应用程序开发方法与实践》答疑-关于对象创建、self、成员变量与属性

有很多读者跟我说,他们在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];
这是一种Objective-C中约定俗成的写法,在init中调用当前类的基类的初始化方法(即BaseClass的init方法,其中的super关键字用于调用基类中的方法),并赋值给self(self关键字表示接收当前消息的对象引用)。这条语句的目的是在初始化子类(SubClass)对象时,首先调用基类(BaseClass)的初始化方法,将基类中定义的成员变量先初始化好,然后再将子类中定义的成员变量初始化。

你可能觉得奇怪,为什么要将基类初始化方法的返回值赋值给self?这是因为基类的初始化方法有可能会返回另外一个对象的地址,而不是当初调用init方法的对象地址。所以我们在创建对象的时候,不应该把alloc语句与init语句分开,必须串接起来。

SubClass* newSub = [[SubClass alloc] init]; //正确

//SubClass* newSub = [SubClass alloc]; 
//[newSub init]; //错误,init方法有可能返回另一个地址


二、关于self


未完待续。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值