从开始学的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. Sherlock and The Beast

    Sherlock Holmes suspects his archenemy, Professor Moriarty, is once again plotting something diaboli ...

  2. 203. Segment Tree Modify

    最后更新 二刷 08-Jan-2017 利用线段树来更改,找到更改的NODE,然后更改那个brach上的所有max值. 首先确定recursion的终止条件 然后通过判断大小来找方向 找到NODE之后 ...

  3. MyBatis(3.2.3) - One-to-one mapping using nested Select

    We can get Student along with the Address details using a nested Select query as follows: <result ...

  4. JSP连接mysql 驱动包

    360网盘 https://yunpan.cn/cPxT6CV9Kydyb  访问密码 1df9

  5. 剑指offer_快速查找递增二维数组中是否存在目标

    [编程题]二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数     ...

  6. SharePoint Server 2013介绍v2

    SharePoint Server 2013介绍v2 http://wenku.baidu.com/link?url=rNYYoDmHcXmqhzOeA1sln5cS2xcnABYycBuz8Z4Oq ...

  7. java新手笔记29 读取文件

    1.读取文件 package com.yfs.javase; import java.io.FileInputStream; import java.io.FileReader; import jav ...

  8. css3学习笔记之背景

    background-size background-size指定背景图像的大小 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 &l ...

  9. Mysql 数据库的介绍

    MySQL 数据库: Oracle.DB2.SQL Server.MySQL.access.mangodb.bigtable 关系型数据库 大型 Oracle.DB2 中小型 SQL Server.M ...

  10. C++记录2

    1, 求成员变量的偏移: 2, const实现机制:在编译期间完成,对于内置类型,如int, 编译器可能使用常数直接替换掉对此变量的引用.而对于结构体不一定. 编译器在优化代码时把j直接优化成64h了 ...