先来看一段代码:
NSString* s; s = [[NSString alloc] initWithString:@"hello ios"];
这是一段最简单的字符串定义,但是看似简单,其实有很多东西可能会被忽略掉
1.这里的s其实是个指针,在oc中除了基本数据类型之外的变量类型都是指针类型,oc的对象也是通过指针进行操作的。
2. 在第一段代码定义了NSString类型的指针变量,但是并没有指向任何对象,第二段代码alloc一个NSString对象 然后使s指向它,并通过s开始其的后续操作。
3. 这里s的内存空间在栈内存中,“hello ios”在堆内存中。
下面通过图示说明一下
再来看一个例子
@interface C: NSObject { int a; int b; } @end int main(int argc, const char *argv[]) { C *c1 = [[C alloc]init]; C *c2 = [[C alloc]init]; }
内存分布情况
看到这里大家也就能明白了,oc中创建的对象指针存储在栈内存中,而alloc出来的对象的内存在堆内存中,栈内存中的指针通过赋值指向堆内存中的对象,然后通过栈内存中的指针访问对象及其变量,也就是说,其实我们在创建一个对象时其实是利用了两个部分的内存空间。