要理解实例变量,得先说一下函数
调用的过程。
函数
下面是一个简单的代码:
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
的时候,会先去创建父类的实例变量,再到子类的实例变量。多层级继承同理。
类实例
理解了上面介绍的实例变量,我想再去理解类实例就很好理解了。
如果把类看作一个功能集合,那类的定义
相当于描述类有什么功能;使用这些功能时,需要依赖类的内部变量,那就得先创建这些变量,创建这些变量的过程称为类的实例化
。这些变量是需要保存在内存中的,如果把这块内存看做一个容器,那这个容器称为类实例
。(注意:逻辑上将一个实例看做一块内存,但是实际上,内存几乎不可能是连续的)