要理解实例变量,得先说一下函数
调用的过程。函数
下面是一个简单的代码:atom
void function(int a) { printf("%d", a); } int A = 5; function(A);
function()
的定义中,变量a
是一个形参,调用时的那个变量A
称为实参。
函数的定义中那个变量a
实际上在内存中是不存在的
!
问题来了,变量a
若是不存在的话,函数怎么正常执行呢?code
咱们调用函数的过程是这样的:
咱们建立了变量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
就是一个实例变量。那为何它会被称为实例变量呢?it
这个类的定义中变量_value
是不存在内存中的!至关于上面函数定义里面的形参
。io
调用下面代码:function
TestObject * object = [[TestObject alloc] init];
运行上面那行代码,你应该能看懂,建立了一个TestObject
类实例。容器
咱们都知道,须要有类实例才能对类进行操做,而同一个类能够有无限多个实例。
变量
那实例建立的过程是怎样的呢?
内部的过程大体是这样的:
调用了一个工厂方法alloc
,实例方法init
(这里不讨论)。
其中最关键的地方在于alloc
的调用,它被调用时,建立了变量_value
。
刚刚建立的_value
至关于上面介绍的,调用函数
时的A"
。而类定义中的_value
至关于 形参a
。
刚刚建立的_value
就是类的变量的实例(真实存在内存中)。
若是你还惦记着上面“忘掉”的继承
:
其实也不复杂,在调用alloc
的时候,会先去建立父类的实例变量,再到子类的实例变量。多层级继承同理。
理解了上面介绍的实例变量,我想再去理解类实例就很好理解了。
若是把类看做一个功能集合,那类的定义
至关于描述类有什么功能;使用这些功能时,须要依赖类的内部变量,那就得先建立这些变量,建立这些变量的过程称为类的实例化
。这些变量是须要保存在内存中的,若是把这块内存看作一个容器,那这个容器称为类实例
。(注意:逻辑上将一个实例看作一块内存,可是实际上,内存几乎不多是连续的)