[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第十章 对象初始化

10.1 分配对象

向某个类发送alloc消息,能为类分配一块足够大的内存用来存放该类的全部实例变量,同时alloc还将这块内存区域全部初始化为0.

刚分配的对象并不能立即使用,需要先初始化。

初始化:从操作系统取得一块内存存储对象。

init方法返回其正在初始化的对象

10.11 初始化对象

注意:初始化方法返回的对象跟分配的对象可能不同。例:字符串初始化函数可能会决定创建一个不同类的对象。

10.12 编写初始化方法

//让超类完成其自身的初始化工作
self = [super init]
//更新self,以便其后的实例变量的引用可以被映射到正确的内存位置
if(self = [super init])
//如果init返回nil,表明未能初始化该对象

注意:将赋值和条件判断是一种常见的技术

10.13 初始化时要做些什么

两种不同的初始化方式:

1. init方法创建了该对象包含的其它对象

2. init方法只创建该对象本身

惰性求值(lazy evaluation):即使你目前没有设置自定义属性的值,也应该等到调用者需要时再创建对象。

10.2 便利初始化函数

便利初始化函数(convenience initializer):用来完成某些额外工作的初始化方法,可减轻负担。

如果对象必须要用某些信息进行初始化,那么应该将这些信息座位init方法的一部分添加进来。

10.3 更多部件改进

将轮胎的数组形式改为NSMutableArray形式

@interface Car : NSObject
{
   NSMutableArray *tires;
}

-(void)setTire: (Tire *) tire atIndex: (int) index;
-(Tire *) tireAtIndex: (int) index;

init 方法:

- (id) init {

  if (self = [super init])
  {
     tires = [[NSMutableArray alloc] init];

     int i;
     for (i = 0; i < 4; i++)
     {
      [tires addObject: [NSNull null]]; //添加4个NSNull对象
     }
     //初始化即生成4个元素的数组
}
  return (self);

} // init

访问方法:

- (void) setTire: (Tire *) tire atIndex: (int) index
{
  [tires replaceObjectAtIndex: index withObject: tire];
  //以每个轮胎为单位
  // 数组被销毁时,将释放数组中所有对象,tire也会被清理
}
- (Tire *) tireAtIndex: (int) index
{
    Tire *tire;
    tire = [tires objectAtIndex: index];

    return (tire);

    //可简化为:return([tires objectiveAtIndex: index]);
}

10.4 Car类的内存清理

原来创建tire对象方式:

        Tire *tire;
        tire = [[Tire alloc] init];
        [tire setPressure: 23 + i];
        [tire setTreadDepth: 33 - i];

重新定义init方法:

@interface Tire : NSObject
      {
        float pressure;
        float treadDepth;
      }
      - (id) initWithPressure: (float) pressure treadDepth: (float) treadDepth;
      - (void) setPressure: (float) pressure;
      - (float) pressure;
      - (void) setTreadDepth: (float) treadDepth;
      - (float) treadDepth;
@end

新init方法实现:

- (id) initWithPressure: (float) p treadDepth: (float) td
      {
        if (self = [super init])
        {
          pressure = p;
          treadDepth = td;

        }
        return (self);
      }

创建tire对象新方式:

      Tire *tire;
      tire = [[Tire alloc] initWithPressure: 23 + i treadDepth: 33 - i];

10.5 指定初始化函数

tire类的四个初始化方法:

- (id) init {
  if (self = [super init]) {
    pressure = 34.0;
    treadDepth = 20.0;
}
  return (self);
} // init

- (id) initWithPressure: (float) p
{
  if (self = [super init]) {
    pressure = p;
    treadDepth = 20.0;
}
  return (self);
} // initWithPressure

- (id) initWithTreadDepth: (float) td
{
  if (self = [super init]) {
    pressure = 34.0;
    treadDepth = td;```
}
  return (self);
} // initWithTreadDepth

- (id) initWithPressure: (float) p
             treadDepth: (float) td
{
        if (self = [super init]) {
          pressure = p;
          treadDepth = td;
        }
        return (self);
} // initWithPressure:treadDepth:

Tire类新初始化方式:


- (id) init
{
    if (self = [self initWithPressure: 34
                     treadDepth: 20]) {
    }

    return (self);

} // init

- (id) initWithPressure: (float) p
{
    if (self = [self initWithPressure: p
                     treadDepth: 20.0]) {
    }

    return (self);

} // initWithPressure

- (id) initWithTreadDepth: (float) td
{
    if (self = [self initWithPressure: 34.0
                           treadDepth: td])
    {
    }

    return (self);

} // initWithTreadDepth

- (id) initWithPressure: (float) p
             treadDepth: (float) td
{
    if (self = [super init])
    {
        pressure   = p;
        treadDepth = td;
    }

    return (self);

} // initWithPressure:treadDepth:

Tire的子类的声明文件:


- (id) initWithPressure: (float) p treadDepth: (float) td
{   //根据父类的指定初始化函数编写

    if (self = [super initWithPressure: p
                            treadDepth: td]) {
        rainHandling = 23.7;
        snowHandling = 42.5;
    }

    return (self);

} // initWithPressure:treadDepth

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-23 12:34:37

[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第十章 对象初始化的相关文章

PHP 学习笔记(一):基础教程:语法,变量,函数,数组,超全局

PHP简介 PHP 脚本在服务器上执行. 什么是 PHP 文件 PHP 文件能够包含文本.HTML.CSS 以及 PHP 代码 PHP 代码在服务器上执行,而结果以纯文本返回浏览器 PHP 文件的后缀是 ".php" PHP能够做什么 PHP 能够生成动态页面内容 PHP 能够创建.打开.读取.写入.删除以及关闭服务器上的文件 PHP 能够接收表单数据 PHP 能够发送并取回 cookies PHP 能够添加.删除.修改数据库中的数据 PHP 能够限制用户访问网站中的某些页面 PHP

《Python基础教程 第2版&#183;修订版》 第2章 列表和元组(学习笔记&#183;总)

这章东西有点多,因此,分成了三份来写,总体来说,这章内容较基础,以下是一二三的链接 <Python基础教程 第2版·修订版>第2章 列表和元组(学习笔记·一) <Python基础教程 第2版·修订版>第2章 列表和元组(学习笔记·二) <Python基础教程 第2版·修订版>第2章 列表和原组 (学习笔记·三) 版权声明:本文为博主原创文章,未经博主允许不得转载.

《python基础教程(第二版)》学习笔记 字符串(第3章)

<python基础教程(第二版)>学习笔记 字符串(第3章)所有的基本的序列操作(索引,分片,乘法,判断成员资格,求长度,求最大最小值)对字符串也适用.字符串是不可以改变的:%左侧是格式字符串,右侧是需要格式化的值print '%s=%d' % ('x',100) ==> x=100%% 格式字符串中出现 %模板字符串:from string import Templates=Template('$x is 100');  s.substitute(x='ABC');  ==> '

《Python基础教程(第二版)》学习笔记 -&gt; 第九章 魔法方法、属性和迭代器

准备工作 >>> class NewStyle(object): more_code_here >>> class OldStyle: more_code_here 在这两个类中,NewStyle是新式的类,OldStyle是旧式的类,如果文件以__metaclass__ = type 开始,那么两个类都是新式类. 构造方法 构造方法,当一个对象被创建后,会立即调用构造方法.Python中创建一个构造方法,只要把init方法的名字从简单的init修改成__init__

《Python基础教程(第二版)》学习笔记 -&gt; 第十章 充电时刻 之 标准库

SYS sys这个模块让你能够访问与Python解释器联系紧密的变量和函数,下面是一些sys模块中重要的函数和变量: 函数和变量 描述 argv 命令行参数,包括脚本和名称 exit([arg])                退出当前的程序,可选参数为给定的返回值或者错误信息 modules 映射模块名字到载入模块的字典 path 查找模块所在目录的目录名列表 platform 平台标识符 stdin 标准输入流-- 一个类文件对象 stdout 标准输出流-- 一个类文件对象 stderr

《python基础教程(第二版)》学习笔记 字典(第4章)

<python基础教程(第二版)>学习笔记 字典(第4章)创建字典:d={'key1':'value1','key2':'value2'}lst=[('key1','value1'),('key2','value2')]; d=dict(lst)d=dict(key1='value1', key2='value2')字典基本操作:d={'key1':'value1','key2':'value2'}; len(d) ==> 2 #字典中的键值对数量d={'key1':'value1','

《python基础教程(第二版)》学习笔记 基础部分(第1章)

<python基础教程(第二版)>学习笔记基础部分(第1章)IDEWindows: IDLE(gui), Eclipse+PyDev; Python(command line);Linux/Unix: python >>> 1/2=0 注意整除得0>>> from __future__ import division 执行普通的除法python -Qnew 执行普通的除法 //整除,  1//2=0:%取余数:**乘幂长整型数: 末尾带L十六进制,以0x开头

《Python基础教程 第2版 修订版》学习笔记(一)

<Python基础教程 第2版 修订版>学习笔记(一) 第一章:快速改造:基础知识 1.1 安装Python (略) How to Become a Hacker: http://www.catb.org/~esr/faqs/hacker-howto.html 中文版:如何成为一名黑客 http://blog.jobbole.com/64196/ (伯乐在线版,个人认为目前比较完善的版本) 1.2 交互解释器 >>> 1.3 算法是什么 目标:煮一盘午餐肉加鸡蛋的食物 过程:

Linux 程序设计学习笔记----终端及串口编程基础之概念详解

转载请注明出处,谢谢! linux下的终端及串口的相关概念有: tty,控制台,虚拟终端,串口,console(控制台终端)详解 部分内容整理于网络. 终端/控制台 终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念. 1.终端 一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源. 终端有字符哑终端和图形终端两种. 控制台是另一种人机接口, 不通过终端与主机相连, 而是通过显示卡-显示器和键盘接口分别与主机相连, 这是人控制主机的第一人机接口.

nodejs学习笔记_nodejs和PHP在基础架构上的差别--共享状态的并发

绝大多数对于Node.js的讨论都把关注点放在了处理高并发能力上,做开发的时候一定要明确node内部做出的权衡,以及node应用性能好的原因. node 为javascript引入了一个复杂的概念,:共享状态的并发. node採用一个长期执行的进程 而php在apache中会产生多个进程 例如以下图所看到的: 代码验证: PHP: <?php $i = 0; $i++; echo $i nodejs: var http = require('http'); var i=0; http.creat