前面我们知道了怎么设计类, 以及怎么创建类, 那么这次我们来讲讲OC的对象与函数吧~~
下面我们来看一个例子~~
#import <Foundation/Foundation.h> @interface Car : NSObject { @public int wheels; int speed; } - (void)run; @end @implementation Car - (void)run { NSLog(@"%d个轮子, 速度为%d/km车子跑起来了", wheels, speed); } @end void test(int w, int s) { w = 20; s = 200; } int main() { Car *p = [Car new]; p->wheels = 8; p->speed = 250; [p run]; return 0; }
前面我们知道了, OC和C是可以混编的, 而且是完全兼容, 那么问题来了, 如果我改一下呢?
void test(Car *newC) { newC->wheels = 5; } int main() { Car *p = [Car new]; p->wheels = 8; p->speed = 250; test1(p); [p run]; return 0; }
那么它在内存的存储空间又是怎样呢?? 我们来看看示意图:
首先, 我们来分析一下:
1. 创建了Car类的一个对象, [Car new]并且用Car *p指向了它, 所以获得了这个对象的地址ffd0.
2. 给对象的wheels和speed赋值.
3. 创建一个test函数, 参数是Car *newC类型, 并且把p传入进去.
4. test函数里就获得了p的地址, 并且给wheels赋值.
所以输出的结果就是:
2015-01-13 22:22:47.565 a.out[7420:745547] 5个轮子, 速度为250/km车子跑起来了
那如果再改一些呢?
void test1(Car *newC) { Car *c2 = [Car new]; c2->wheels = 2; c2->speed = 80; newC = c2; newC->wheels = 1; } int main() { Car *p = [Car new]; p->wheels = 8; p->speed = 250; test(p->wheels, p->speed); test1(p); [p run]; return 0; }
下面我们来看看示意图:
解析一下:
1. 把p的地址传入到test函数里.
2. 在test函数里创建了一个新的对象.
3. 把新的内存对象地址给了newC, 也就是说p和里面的newC已经没有关系了, 所以改变了newC的wheels的值, p也不会改变.
所以输出的结果是:
2015-01-14 00:20:48.310 a.out[7671:783844] 8个轮子, 速度为250/km车子跑起来了
好了, 这次我们就讲到之类, 下次我们继续~~~