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

    NSString *name=[NSString alloc];

NSLog(@"%p",name);

name=[name init];

NSLog(@"%p",name);

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

   2014-07-07 13:19:51.724 LessonMRC2[1222:303] 0x100203850

         2014-07-07 13:19:51.726 LessonMRC2[1222:303] 0x7fff73ada7b8

alloc是开辟一个内存空间,init是初始化,为什么初始化不在原有的内存空间上初始化,而是重新开辟一个内存空间

于是开始查资料,这时又发现了一个新的迷惑:

NSObject *obj=[NSObject alloc];

NSLog(@"%p",obj);

obj = [obj init];

NSLog(@"%p",obj);

打印之后:

    2014-07-07 13:23:10.663 LessonMRC2[1232:303] 0x100103730

    2014-07-07 13:23:10.665 LessonMRC2[1232:303] 0x100103730

怎么地址又变一样了

在打印NAArray的试一试

NSArray *name=[NSArray alloc];

NSLog(@"%p",name);

name=[name init];

NSLog(@"%p",name);

打印:

2014-07-07 13:26:15.154 LessonMRC2[1244:303] 0x100103740

2014-07-07 13:26:15.156 LessonMRC2[1244:303] 0x100102f50

仍然是不一样的.

原因是什么哪?

    首先看看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后的指针称为什么哪? 悬挂指针.  

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

Object c中的alloc和init问题的更多相关文章

  1. Objective-C中的alloc和init问题

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

  2. iOS中alloc与init

    面向对象的3大特性,封装继承和多态. 我遇到过封装相关的问题,因为初级封装简单,常常暴露出被你封装的接口,进一步进行高级封装隐藏接口的时候才发现,封装是一门学问,而这门学问得从最基础的alloc与in ...

  3. alloc、init你弄懂50%了吗?

    前言 这是一篇我记录对alloc.init分析思考的笔记.如果读者想看懂我的第二个思考,可能需要您至少了解内存的分段分页管理,如果您对其一点都不知道,可以先看这篇软文简单了解一下.另外很重要的一点是, ...

  4. iOS 中的视图函数 init initwithnib viewDidLoad viewWillAppear的总结

    我要总结的函数主要是这几个: UIView *view-如果view还没有被初始化的话,getter方法会先调用[self loadView],如果getter或者setter方法被重写了,子类中的g ...

  5. 重写Object类中的equals方法

    Object是所有类的父亲,这个类有很多方法,我们都可以直接调用,但有些方法并不适合,例如下面的student类 public class Student { //姓名.学号.年纪 private S ...

  6. [Effective JavaScript 笔记]第47条:绝不要在Object.prototype中增加可枚举的属性

    之前的几条都不断地重复着for...in循环,它便利好用,但又容易被原型污染.for...in循环最常见的用法是枚举字典中的元素.这里就是从侧面提出不要在共享的Object.prototype中增加可 ...

  7. 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解(转载)

    java中的hashcode.equals和toString方法都是基类Object的方法. 首先说说toString方法,简单的总结了下API说明就是:返回该对象的字符串表示,信息应该是简明但易于读 ...

  8. Object类中getClass()

    Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类.类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型.所有的类型类 ...

  9. Object类中方法详解

    目录 概述 hashCode方法 getClass方法 toString方法 equals方法 clone方法 finalize方法 概述 Object 是类层次结构的根类.每个类都使用 Object ...

随机推荐

  1. centos 安装ss-QT5

    方法一(DNF指令): 1.如果未安装DNF,请跳转至:http://dev.fjuts.com:83/blog/index.PHP/Linux/261.html2.添加shadowsocks 的 c ...

  2. C# 条形码识别

    目录: 一.识别库 二.从一张图片中提取多个条形码 三.注意事项 从博客园学了很多,本着分享的目的,希望后来者遇到类似问题时,不必重复造轮子,早点下班回家^-^. 一.识别库 目前主流的识别库主要有Z ...

  3. CSS—换行

    关于文本溢出换行问题,先看下涉及到换行的相关属性,查看:http://www.w3school.com.cn 一.word-break 定义:word-break 属性规定自动换行的处理方法. 值 描 ...

  4. 关于css制作圆角

    三个阶段: 1.背景图片: 2.css2.0+标签模拟圆角: 3.css3.0圆角属性(border-radius). 1.1.背景图片--宽度固定,高度自适应圆角 为容器设置宽度 在主体的上方加一个 ...

  5. Excel日期格式单元格写成yyyy.MM.dd格式将无法读取到DataTable

    最近在改公司的订单系统,遇到了一个奇怪的问题.C#程序需要从Excel文件中将数据全部读取到DataTable,其中Excel文件的第一列是日期格式yyyy/MM/dd,而这一列中大部分的单元格都是按 ...

  6. Java Servlet-http协议

    ---恢复内容开始--- 互联网三大基石: url:定位数据 html:显示数据 http:传输数据

  7. C# winform 选择项 省市连动

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  8. 修改Windows硬盘分区名称

    本文由 www.169it.com 收集整理 如果用户在将 XP 重装成Win7/Win8时,原本的硬盘分区名称可能会出现无法更改的情况,重新命名也都起不了作用.这种情况一般是因为使用 XP 系统下 ...

  9. jFinal中报对应模型不存在的错误(The Table mapping of model: demo.User not exists)

    jFinal中报对应模型不存在的错误(The Table mapping of model: demo.User not exists) 贴出错误: java.lang.RuntimeExceptio ...

  10. 记redis的一个测试

    现有020的系统架构走库存,取券通过Fetch前n条来实现买n张优惠券,但此做法在高并发时有严重的性能问题,性能问题主要体现在数据库. 为了优化此性能,系统改为redis,走队列模式,即生产者消费者. ...