博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C中的alloc和init问题
阅读量:7224 次
发布时间:2019-06-29

本文共 1184 字,大约阅读时间需要 3 分钟。

从开始学的NSString *name=[[NSString alloc] init] 起,仅仅这句话是分配内存空间,一直在用,从来没考虑过它的内部是怎么实现的。今天无意中看到了这一句代码:

NSString *name = [NSString alloc];NSLog(@"%p",name);name = [name init];NSLog(@"%p",name);

试着打印了一下,发现两个的内存地址不一样:

 

alloc是开辟一个内存空间,init是初始化,为什么初始化不在原有的内存空间上初始化,而是重新开辟一个内存空间。于是开始查资料,这时又发现了一个新的迷惑:

NSObject *obj = [NSObject alloc];NSLog(@"%p",obj);obj = [obj init];NSLog(@"%p",obj);

打印结果:

怎么地址又变一样了?再打印NSArray的试一试:

NSArray *person = [NSArray alloc];NSLog(@"%p",person);person = [person init];NSLog(@"%p",person);

再次打印结果:

仍然是不一样的。原因是什么呢?首先看看NSStrng的init方法吧:

-(id)init{    if(self = [super init])  {// 重新赋值        //…    }}

从代码中可以分析,self=[super init]如果不为nil,就重新分配内存空间,这就解释了为什么 NSString,NSArray的调用alloc]init]方法后,内存地址会不一样,但是NSObject为什么会一样呢,我们知道NSObject是一切类的基类,当[[NSString alloc]init]执行时,调用的[super init]就是 NSObject中的init方法,既然NSObject身为基类,它也就无法调用super init,所以当NSObject执行[[NSObject alloc]init]时,也就没有了init重新分配空间这一环节。

至于苹果公司为什么初始化一个实例要分两步,个人认为是方便构造后初始化不同的方法,如果用 new关键字,只能调用一个init,而不能调用initWithName等方法。

知识拓展:

NSString  alloc之后,没有init,那么这部分alloc后的内存空间可不可以用?答案是显而易见的,如果可以用,苹果公司也就没必要提供一个init方法,那么alloc后的指针称为什么呢? 悬挂指针。 

如果一个地方指针既不为空,也没有被设置为指向一个已知的对象,则这样的指针称为悬挂指针。在程序里面是很危险的事。当程序运行使用该指针时,程序不能判断指针的合法性,将会产生很严重的错误。

转载地址:http://mieym.baihongyu.com/

你可能感兴趣的文章
CF每日一练(2.11)
查看>>
operator ->
查看>>
react select
查看>>
JDBC 编程初步
查看>>
数据库SQL归纳(一)
查看>>
第9条:覆盖equals时总要覆盖hashCode
查看>>
产品经理工具
查看>>
ny495 少年 DXH
查看>>
http://www.cnblogs.com/doubleliang/tag/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/
查看>>
关于树及其各种操作
查看>>
医生问题
查看>>
Sublime Text3 配置 NodeJs 开发环境
查看>>
javascript中的对象查找
查看>>
给年轻工程师的10大忠告
查看>>
补习系列(7)-springboot 实现拦截的五种姿势
查看>>
Github网站加载不完全,响应超时,如何解决
查看>>
rem自适应布局
查看>>
django 坑~~
查看>>
Python 函数
查看>>
Linux64位程序中的漏洞利用
查看>>