obj中创建新对象有两种方式:[classname new]和[[classname alloc] init]。两种方法等价,Cocoa惯例是使用alloc和init。

1.分配对象:

allocation是一个新对象诞生过程,从OS获得一块内存并指定为存放对象的实例变量的位置。同时alloc方法还将这块内存区域全部初始化为0。BOOL初始化为NO,int初始化为0,float初始化为0.0,指针初始化为nil。

然后init初始化之后才能使用,C++和Java中使用构造函数在单次操作中执行对象的分配和初始化,Objective-C将两个操作分开。

2.Car *car = [[Car alloc] init];

-(id)init

{

if(self=[super init])

{

engine=[Engine new];

tires[0]=[Tire new];

}

}

-(id)init返回值,id可表不同的对象。init可以接受参数并可能判断返回另外一个类的对象可能更合适。比如从一个很长的字符串生产一个新的字符串。

if(self=[super init]) 首先的是[super init],使超类完成自己的初始化工作。使超类执行所需任何操作,以便对象能响应消息并处理保留计数器。实例变量所在的内存位置到隐藏的self的距离是固定的,如果init方法返回一个新对象,则需要更新self,以便之后的实例变量的引用能映射到正确的内存位置,self=[super init]赋值就是这个作用,只影响init方法中self的值,不影响init范围以外的内容。初始化一个对象出错时,返回nil。if(self=[super init])典型的C风格,一般不采用self=[super init] if(self)...

在car的初始化中给实例变量赋值并创建car所需要的engine和tires对象。可以一次创建所有所需要的对象,使得Car类可以[[Car alloc] init]之后可以立即使用;也可以先为engine对象和tire对象预留位置,等调用者需要的时候再创建对象,惰性求值(lazy evaluation)。

3.便利初始化函数。

为了减少工作麻烦,很多对象有多个init开头的方法。NSString类为例子:

NSString *emptyString = [[NSString alloc] init];

NSString *str = [[NSString alloc] initWithFormat:@"%d or %d",2,33];

NSString *str = [[NSString alloc] initWithContentsOfFile:@"/tmp/1.txt"];

Xcode提供的自动匹配功能非常使用,输入init按esc键后会显示所有的可以匹配的函数。

所有使用alloc,copy,new方法创建的对象,只用完成之后都需要释放。[str release];

NSString *str = [NSString stringWithFormat:@"%.1f",20.0];  str这里是可以自动释放的,当自动释放池销毁时,该字符串对象也被清理。

一般在main函数首先创建自动释放池,为自动释放的对象在等待自动释放池被销毁时提供容身之所:

NSAutoreleasePool *pool;

pool = [[NSAutoreleasePool alloc] init];

在程序结束时,pool释放,并向池中的所有对象发送release消息:

[pool release];

4.指定初始函数

我们可以自己编写方便的便利初始化函数,并且可以编写多个。但必须指定某个初始化方法为指定初始化函数,该类的所有初始化方法使用指定初始化函数执行初始化操作。子类使用其超类的指定初始化函数实现超类的初始化。如果构造了一个初始化函数,需要在自己的指定初始化函数中调用超类的指定初始化函数。如果不指定初始化函数,那么该类子类可能需要重写所有的它的初始化函数。

Objective-C基础学习笔记——对象初始化的更多相关文章

  1. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  2. C++基础 学习笔记之一:源代码的格式化

    C++基础 学习笔记之一:源代码的格式化 1. 源代码中的标记与空白 C++中的语句是以分号表示语句的结束.在C++中空格和回车以及制表符均为相同作用,即三者通常可以互相替代. 例如可以将一个简单的m ...

  3. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  4. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

  5. C#RabbitMQ基础学习笔记

    RabbitMQ基础学习笔记(C#代码示例) 一.定义: MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开发).MQ是一种应用程序对应用程序的通信方法. ...

  6. handlebars.js基础学习笔记

    最近在帮学校做个课程网站,就有人推荐用jquery+ajax+handlebars做网站前端,刚接触发现挺高大上的,于是就把一些基础学习笔记记录下来啦. 1.引用文件: jquery.js文件下载:h ...

  7. Oracle基础学习笔记

    Oracle基础学习笔记 最近找到一份实习工作,有点头疼的是,有阶段性考核,这...,实际想想看,大学期间只学过数据库原理,并没有针对某一数据库管理系统而系统的学习,这正好是一个机会,于是乎用了三天时 ...

  8. C++基础 学习笔记五:重载之运算符重载

    C++基础 学习笔记五:重载之运算符重载 什么是运算符重载 用同一个运算符完成不同的功能即同一个运算符可以有不同的功能的方法叫做运算符重载.运算符重载是静态多态性的体现. 运算符重载的规则 重载公式 ...

  9. 【C#编程基础学习笔记】4---Convert类型转换

    2013/7/24 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]4---Convert类型转换 ...

随机推荐

  1. ssanf()的用法

    转载自http://www.cnblogs.com/lyq105/archive/2009/11/28/1612677.html 看着写着不错,就转了,保存一下 C语言函数sscanf()的用法 ss ...

  2. 【转】node-webkit:开发桌面+WEB混合型应用的神器

    顾名思义,node-webkit就是nodejs+webkit. 这样做的好处显而易见,核心奥义在于,用nodejs来进行本地化调用,用webkit来解析和执行HTML+JS. 快速上手 下载node ...

  3. Jsp笔记(1)

    1. jsp页面中出现中文乱码怎么解决? <%@ page contentType="text/html; charset=GB2312"%> <%@ page ...

  4. DataGrid GridView 单页javascript 表头排序

    JS代码如下: <script> var curObj; var shell = 1; function sortTable(L) { var start=new Date() var i ...

  5. iOS更改ShareSDK默认的分享功能界面

    ShareSDK的集成这里就不详细介绍了, 官网的都已经够详细了.. 官方的默认分享样式如下: 贴上我的源代码: // 创建分享图片 NSString *imageURLString = @" ...

  6. 关于Visual Studio中的TraceDebugging文件夹

    最近一段时间发现C盘莫名其妙的变小了,各种清理各种卸载还是没用,电脑慢的是在无法使用 .最后只能一个文件夹一个文件夹的找,最后针对“C:\Documents and Settings\All User ...

  7. thinkphp基础入门(2)

    第一节介绍了thinkphp基本路径问题,第二节将介绍thinkphp的常见用法(M层跟V层) 我们先在Controller层新建个IndexController.class.php(新建文件的格式为 ...

  8. WDCP控制面板安装卸载

    安装 安装源码 WDCP提供两种安装模式,一种是源码安装,一种是RPM包安装,众所周知,源码安装虽然安装时要比RPM包安装繁琐,但是使用上要节省内存.所以我这里主要介绍源码安装. 首先是下载安装源代码 ...

  9. ubuntu 下telnet 操纵memcache 实现

    memcache作为一款优秀的进程外缓存,常常被运用于高并发系统架构中.这里主要谈谈怎么通过telnet工具,查看memcache运行状况并对其key进行管理维护.假设memcache安装目录:/us ...

  10. php 编码规范(1)

    1. 包含尽量不要使用短标签例如 <? #coding ?> 2. 忽略结束标签,防止其他字符或者空格影响到代码 <?php$foo = 'foo'; 如果不开启压缩或者缓存输出时候 ...