更好地理解实例变量和类实例

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

函数

下面是一个简单的代码: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的时候,会先去建立父类的实例变量,再到子类的实例变量。多层级继承同理。

类实例

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

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

相关文章
相关标签/搜索