2

要理解实例变量,得先说一下函数调用的过程。

函数

下面是一个简单的代码:

void function(int a)
{
    printf("%d", a);
}
int A = 5;
function(A);

function()的定义中,变量a是一个形参,调用时的那个变量A称为实参。
函数的定义中那个变量a实际上在内存中是不存在的
问题来了,变量a如果不存在的话,函数怎么正常执行呢?

我们调用函数的过程是这样的:
我们创建了变量A(内存中真实存在的变量),调用函数的时候,会先在内存中创建一个A的副本A"A"真实的占用内存!A"会被传入函数中充当a的位置。这样函数才可以被正常运行!
所以,每次调用函数时,都会产生不同的A"(这里A"指的是你传入参数的副本)。

先看一个简单的object-c类定义,了一个属性value

  • 因为涉及到继承,问题会变得更复杂一些,为了更好理解,我们先忘掉继承,只关注下面的代码。
@interface TestObject : NSObject
{
    int _value;
}
@property (assign, nonatomic) int value;
@end

@implementation TestObject
- (int)value
{
    return _value;
}
- (void)setValue:(int)newValue
{
    _value = newValue;
}
@end

根据实例变量的定义_value就是一个实例变量。那为什么它会被称为实例变量呢?

这个类的定义中变量_value是不存在内存中的!相当于上面函数定义里面的形参

调用下面代码:

TestObject * object = [[TestObject alloc] init];

运行上面那行代码,你应该能看懂,创建了一个TestObject类实例。

我们都知道,需要有类实例才能对类进行操作,而同一个类可以有无限多个实例。

那实例创建的过程是怎样的呢?

内部的过程大致是这样的:

调用了一个工厂方法alloc,实例方法init(这里不讨论)。

其中最关键的地方在于alloc的调用,它被调用时,创建了变量_value

刚刚创建的_value相当于上面介绍的,调用函数时的A"。而类定义中的_value相当于 形参a

刚刚创建的_value就是类的变量的实例(真实存在内存中)。

关于继承

如果你还惦记着上面“忘掉”的继承
其实也不复杂,在调用alloc的时候,会先去创建父类的实例变量,再到子类的实例变量。多层级继承同理。

类实例

理解了上面介绍的实例变量,我想再去理解类实例就很好理解了。

如果把类看作一个功能集合,那类的定义相当于描述类有什么功能;使用这些功能时,需要依赖类的内部变量,那就得先创建这些变量,创建这些变量的过程称为类的实例化。这些变量是需要保存在内存中的,如果把这块内存看做一个容器,那这个容器称为类实例。(注意:逻辑上将一个实例看做一块内存,但是实际上,内存几乎不可能是连续的)


覃受
2.8k 声望585 粉丝

创造,分享!协作,共赢!