Objective-C中的alloc和init问题

从开始学的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后的指针称为什么呢? 悬挂指针。 

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

时间: 2024-09-17 14:00:46

Objective-C中的alloc和init问题的相关文章

iOS中alloc与init

面向对象的3大特性,封装继承和多态. 我遇到过封装相关的问题,因为初级封装简单,常常暴露出被你封装的接口,进一步进行高级封装隐藏接口的时候才发现,封装是一门学问,而这门学问得从最基础的alloc与init讲起.   FatherModel.h #import <Foundation/Foundation.h> @interface FatherModel : NSObject @end FatherModel.m #import "FatherModel.h" @imple

alloc、init你弄懂50%了吗?

前言 这是一篇我记录对alloc.init分析思考的笔记.如果读者想看懂我的第二个思考,可能需要您至少了解内存的分段分页管理,如果您对其一点都不知道,可以先看这篇软文简单了解一下.另外很重要的一点是,请先思考. 思考1.对象为什么要alloc,init又是干嘛的? 很多人都知道,初始化一个对象应该这么写: MyClass* myObj = [MyClass alloc] init];  那么有没有思考过为什么呢?其实我这么写也是完全可以的: MyClass *myObj = [MyClass a

objective c-在Xcode4中调用方法没用回应

问题描述 在Xcode4中调用方法没用回应 如题,要调用的方法是导入工程中的外来文件,但是工程编译成功了,文件方法调用失败.而且也没有错误提示什么的. 问题描述: 1.下载了 Flickr API(4个文件) 到Xcode文件管理器中,指定赋值和链接到我工程中的4个文件. * Flickr.h * Flickr.m * FlickrPhoto.h * FlickrPhoto.m 2.在主视图控制器中,最先导入了外来文件: #import "Flickr.h" #import "

objective c-在ios中如何获取view的对象实例

问题描述 在ios中如何获取view的对象实例 有一个tableView,添加在界面构建器里的.那么如何获取在view控制器中的实例呢> 在ios中有没有像android中getViewByid的?怎么给view它的id值? 解决方案 一般情况下,通过界面构造器添加的tableView,在ViewController下,通过self.tableView就能访问这个tableView. iOS开发中没有getViewById 或则findViewById这样的方法.view通过outlet和vie

objective c-NSMutableArray中的条目

问题描述 NSMutableArray中的条目 NSMutableArray 中有一些NSNumber . {1 2 3 3 2 1 6 2} 我想知道在列表中每个数字出现的次数: Ex : 1 = 2 2 = 3 3 = 2 6 = 1 解决方案 将所有的条目放到NSCountedSet中 NSCountedSet* countedSet = [[NSCountedSet alloc] initWithArray:array];for (NSNumber* number in countedS

objective c-从view1中修改view2的UItextField

问题描述 从view1中修改view2的UItextField 在ViewController中,修改SecondViewController的UITextView.text 如果它是NSString类型可以这么修改: SVC.string = @"test"; 出现两个问题: messageBox.text没有修改 SVC.messageBox.text 返回(null) ViewController.m: SecondViewController *SVC = [[SecondVi

Linux中ntsysv, service, chkconfig, init, setu详解

一.setup 命令 在 Red Hat Linux 里头有一个相当好用的系统参数设定工具,那就是大家都耳熟能详的『 setup 』??≌夤ぞ咚荡┝艘裁挥惺裁刺厥獾牡胤剑?褪撬??恍 /etc/sysconfig 里的设定参数给他做成图形界面就是了!基本上,如果你对系统熟的话,那么不需要使用 setup 也是可以的啦!直接修改 /etc/sysconfig 底下的东西就可以???br /> setup: 我们先来说一说 setup 的用法吧!以 root 的身份在 command line 输入

objective c-objectiveC中创建NSMutableArray

问题描述 objectiveC中创建NSMutableArray 有一个NSArray给出下面的数据: 01/14/2013 13:28:06.559 IUser Reader [71164: c07] ( { "id_acompanhante" = ""; "id_evento" = 34; "user_id" = 1; "inserido_por" = "Himself"; name

objective c-C中int数组在类接口中的问题

问题描述 C中int数组在类接口中的问题 我希望能在类接口中定义一个作为实体变量的cInt数组,这样我就能通过任意方法访问它. @interface aVCofMine : UIViewController{ int[] myArray;} 还有 @interface aVCofMine : UIViewController{ int myArray[];} 但是完全没用,不知道是不是不能这样定义啊?要是能定义怎么定义? 谢谢. 解决方案 C数组需要动态分配和调整尺寸: @interface A