Objective-C 和 C++中指针的格式和.方法 和内存分配
最近在看cocos2d-x,于是打算复习一下C++,在这里简单对比下,留个念想。
先看看oc中指针的用法
@interface ViewController : UIViewController { int value1; } @property (nonatomic) int value2; @end @implementation ViewController @synthesize value2; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.value2 = 2; self->value2 =2; (*self).value2 = 2; value2 =2 ; // self.value1 = 1; //error self->value1 = 1; (*self).value1 = 1; } @end
从这里看出OC中的对象指针拥有和C和C++指针相同的功能,都可以通过(*p). 或者 -> 2种方式对指针解除引用,并取得对应结构体或对象的信息。
但是需要注意,在oc中的对象名后边直接使用 . 操作符可是和前种语言完全不同的 ,比如这里的 self.value2 = 2。具体不同点如下:
首先,在OC中对象后直接使用.操作符,是不能接方法名称的,这一点和C++不同。
第二,在oc中对象后直接使用.操作符接成员变量的话,是对应get和set方法的调用的简便写法,你甚至可以重写get和set方法,使这个操作与成员变量毫无关系,这一点还可以帮助我们做些事情,请参与我的另一篇文章iOS category中的所谓属性 和 从xib初始化对象的方法 以及类扩展 。C和C++就是对相应的成员变量进行操作。这里顺便说一下,java的. 操作更像C++的操作,不会自动调用相应get和set方法,java仅仅是对属性的访问。
另外,在oc中,需要注意以下情况:
上边的代码中,单单使用了NSString类型来定义a变量,抽象一下就是 类名+变量名 ,编译器就报错了。在C++中这种写法是正确的(java 中就没有指针这一说,当然也是正确的写法了,虽然C++和java都可以,但是含义不同。c++是定义了一个对象,而java仅仅定义了一个类似于指针的句柄,不知道这里用句柄合适不,java中还需要把它指向具体对象才行!)。在stackoverflow上找到了以下解释:
"Statically allocated" in this case would mean that the memory for that object was allocated at compile-time. All objects in Obj-C, however, are allocated at runtime and accessed through pointers.
其实,就是oc和java只能动态地分配内存,即在runtime时分配内存,在编译期间,是无法得到对象类型,也就不能正确地分配内存了。是这样吗?