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