1.OC中是不可以直接声明一个对象的,如:
NSString a;
这样的声明是不被允许的。你可以这样声明:
NSString *a;
这声明的是一个指针,这样编译器会自动为它分配一块内存,不过你会发现此指针打印的时候可能有值,这是因为编译器之前把这块内存地址分配给其它对象或指针使用,这样的一个指针称为悬挂指针。要想此a指向的内容没有东西,这就需要初始化方法:
NSString *a = [NSString alloc]init];
这里的alloc的作用是内存分配,而init的作用是初始化。但在oc中的不同对象,如NSString、NSArray在分别进行alloc、init后的获取的地址却是不同的,大家可以试试。
2.c++中是可以直接声明一个对象的,且c++创建对象不同于oc,Java,c++的对象分在栈上创建和在堆上创建,比如我们定义了一个类Student,下面我们可以这样声明对象:
Student s;
这样的声明是合法的,此处s是在栈区创建的对象,如果想初始化s的话也是可以的,比如Student里有各种成员变量name,sex,这时我们可以这样初始化:
s.name = "朝夕";
s.sex = "男";
这种方式是通过初始化成员变量的方法来初始化对象的。
初始化对象还有一种方法,那就是通过构造函数的方法初始化对象:
s =new Student();
但是这里Student()做的事是创建一个临时对象,这个对象的地址并不同于s的地址,只是将这个临时对象里的内容进行拷贝给了s对象,s对象的地址不变,初始化完成后对象会自动销毁。
以上这两种初始化方法都是对成员变量一个一个进行拷贝,所以初始化速度较慢,快速的创建对象的方法是这样的:
Student *s = new Student();
对于c++中指针的使用很危险,因为随时都有可能被其他的指针操作,所以慎用强引用。
c++中也是可以这样使用声明的对象的:
Student s;
Student *st = &s ;
3.oc中要想对对象进行操作,只能使用指针
NSString *a = [[NSString alloc]init];
[[NSString alloc]init]声明了一个对象,但是这个对象不能直接拿来用,只能通过a来调用。