因为有许多朋友问,每次都要说很多,所以干脆就写出来,都是大白话,目的只有一个就是弄懂。
Person * xiaoMing =[ [Person alloc] init];
首先,我从这句代码开始,上述代码分解为3步:
1)Person *xiaoMing; //为对象起名字,只是名字
2) xiaoMing=[ Person alloc ]; //创建对象
3) [xiaoMing init]; //初始化对象
下面对每一句进行通俗解释:
1)Person *xiaoMing;
创建一个对象的时候,首先系统根据你起的名字xiaoMing在栈区创建一个叫xiaoMing的这么个一个指针;
注意我这么写其实是有问题的,在初始化指针的时候没有赋值,最好赋值为空指针。
Person * xiaoMing = nil; //C语言中用NULL
现在,对象名字就起好了,为什么要用指针?它是对象么?
现在来说,它还不是对象。通过alloc在堆内存中生成的才是对象,只不过没有指针的标识,你不便于找到生成的对象,因为堆内存块在计算机里使用十六进制码标记的,这是不便于记忆的,所以需要指针,xiaoMing很好记吧?但是0xFE35 好记么? 这是为什么用指针。其实指针就是地址,只不过起了个别名。
为什么还不是对象? 如果栈是一个户口登记表的话,上面的xiaoMing 就是一个标识,对象是什么?是他这个人,只不过为了标记他区别他人有了xiaoMing。
例子:
天安门只是一个标记,天安门那个地方才是对象,看得见摸得着的。
天安门的作用就是别名而已,如果你跟朋友说你去了“那个地方” ,谁晓得你去了哪里?但是你跟朋友说你去了天安门,他们就会根据天安门的地址去那个地方。同样,xiaoMing指针会根据指针里面存的 xiaoMing对象的内存地址 找到xiaoMing对象。
所以说,xiaoMing对象 不是在栈区的那个标识,而是堆区的那个内存块。
2) xiaoMing=[ Person alloc ]; //创建对象
创建对象的过程其实就是在堆中开辟一块内存,再把这块内存的地址给xiaoMing指针。如上图中绿色框内。
3) [xiaoMing init]; //初始化对象
创建对象虽然有一块内存,但是里面是垃圾数据,需要初始化才能使用。
这里顺便提下,属性就是描述对象的名词性东西,如姓名,姓名的属性值是小明, 行为就是动词性东西,如跑。