objective-c基础教程(笔记)

时间:2022-09-07 08:30:08

第一章 启航


第二章 对c的扩展

2.1 最简单的objective-c程序

2.2 解构Hello objective-c 程序

1. xcode通过.m扩展名来表示文件使用的是objective-c代码,应由objective-c编译器处理 2. #import可保证头文件只被包含一次,无论此命令在该文件中出现多少次 3. #import<Foundation/Foundation.h>语句告诉编译器查找Foundation框架的Foundation.h头文件 4. @符号意味着引号内的字符串应作为cocoa的NSString元素处理 5. NSArray:存放数组 NSDateFormatter:帮助你用不同的方式设置时间格式 NSThread:提供多线程编程工具 NSSpeechSynthesizer:能让你听到声音

2.3 布尔类型

1. objective-c的BOOL类型,只有YES和NO两个值 2. 使用NSLog()输出任意对象的值,都使用的是%@格式来表示 如:NSLog(@“%@”,boolstring(areTheyDifferent));


第三章 面向对象编程的基础知识

3.1 间接

1.间接可以理解为让其他人代替自己做某件事

2.Count一般为循环变量名

   如:int WordCount = 4;

          for(int i = 0 ; i < WordCount  ; i++)

          {}

3.2 在面向对象编程中使用间接

1. id是一种泛型,可以用来引用任何类型的对象

   id表示标识符(identifier)

2. [ shape draw ];

   shape是绘制外观,draw是执行动作

   objective-c中的方括号用于通知没课对象该去做什么,方括号里的第一项是对象,其余部分是需要对象执行的操作

3. objective-c中,通知对象执行某种操作称为发送信息(调用方法)

[shape draw]理解为“向shape发送draw消息”

3.3有关术语

3.4 objective-c语言中的oop

1.以下是Circle类的接口
@interface Circle : NSObject    //Circle类是基于NSObject类的
{
@private
ShapeColor fillColor;
ShapeRect bounds;
}
/*下面是方法声明*/
- (void) setFillColor : (ShapeColor) fillColor;
- (void) setBounds : (ShapeRect) bounds;
- (void) draw;
@end //Circle




说明: (1)@interface Circle :NSObject   //Circle类是基于NSObject类的 (2)- (void) setFillColor : (ShapeColor) fillColor;     - (void) setBounds : (ShapeRect) bounds;  其中每个方法都有一个参数。 setFillColor:有一个颜色参数,Circle类在绘制自身时会使用该颜色。 setBounds:有一个矩形区域参数,Circle类使用该区域来确定它们的边界。 2. objective-c的中缀符: 你可以这样调用带一个参数的方法 [Circle setFillColor : KRedColor]; 3. 真正使对象能够运行的代码位于@implementation中 4. @implementation后市各个方法的定义。不必按照在@interface指令中的顺序出现。可以在@implementation中定义那些在@interface中没有声明过的方法 5.
/*以下是Triangle类接口声明*/
@interface Triangle : NSObject
{
ShapeColor fillColor;
}
- (void) setFillColor : (ShapeColor) fillColor;
@end //Triangle

/*以下是Triangle实现部分*/
@implementation Triangle
- (void) setFillColor : (ShapeColor) c
{
fillColor = c;
} //setFillColor
@end //Triangle




第四章 继承

4.1 为何适用继承

1.没有继承的 Shape-object 架构

objective-c基础教程(笔记)


2.有继承后改进的Shape-objective 架构
objective-c基础教程(笔记)

3.直接更改由继承得到的实例变量的值是一种不好的习惯。一定要通过方法或 property 属性来更改

4.2 继承的语法格式

1. @interface Circle:Shape     //Circle是子类,Shape是父类@end          //Circle

4.3 继承的工作机制

1.代码发送消息时,objective-c的方法调度机制将在当前类中搜索相应的方法。如果找不到,在该对象的超类中查找

4.4 重写方法


第五章 复合

5.1 什么是复合

1.软件开发中,程序员可用一个Pedal(脚踏板)对象和一个Tire(轮胎)对象组合出虚拟的Unicycle(独轮车)2.在objective-c中,复合是通过包含作为实例变量的对象指针实现的。3.Pedal和Tire通过复合组合成了Unicycle
@interface Unicycle : NSObject
{
Pedal *pedal;
Tire *tire;
}
@end //Unicycle

5.2 自定义NSLog()

1.在 init 方法中,下面代码有些奇怪if(self = [super init]){}(1) 为了让超类将所有要初始化的工作一次性完成,需要调用[super init]。init方法返回的值就是被初始化的对象
(2) 将[super init]返回的结果赋给self 是objective-c的惯例。为了防止超类在初始化过程中返回的对象与一开始创建的不一样

5.3 存取方法

1. setter 方法根据它所更改的属性的名称来命名,并加上前缀set,如setEngine2. getter 方法以返回属性名称命名,如engine

5.4 扩展CarParts程序


5.5 复合还是继承

1. 继承的类之间建立的关系为“is a”(是一个)。如:三角形是一个形状,三角形继承自形状。2. 复合之间的关系为“has a”(有一个)如:形状有一个填充颜色,汽车有一个发动机和四个轮胎


第六章源文件组织


6.1 拆分接口和实现

1. objective-c 源代码分两部分
(1)接口,用来展示类的结构 @interface 部分编译 (2)实现 @implementation 部分告诉编译器如何让该类工作

6.2 拆分Car程序

1. 导入头文件有两种方法,引号或尖括号如:#import<Cocoa/Cocoa.h> 和 #import"Tire.h"2. 尖括号,用于导入系统头文件,只读。引号,说明导入项目本地头文件,可编辑。

6.3 使用跨文件依赖关系

1. @class创建了一个前向引用告诉编译器:“相信我。以后你自然会知道这个类到底是什么,但是现在,你知道这些足矣。”2. 循环依赖关系,@class 很有用。即A类使用B类。如果用#import 让两个类互相引用,会报错。但在A.h 中用@class B,在B.h 中使用@class A,那么这两个类可互相引用。


第七章 深入了解Xcode


7.1 窗口布局一览

7.2 改变公司名称

7.3 使用编辑器的技巧

7.4 在Xcode的帮助下编写代码

1. Command + [ 键 和 Command + ]键可将选定的代码左移和右移
2. Command + Control + S  ,Xcode会记住项目当前的状态。可用File ---Restore Snapshot 找回之前项目
3. Xcode 的查找、替换功能
Command + shift +F 4. command + shift + D 执行Open Quickly命令 5. 按住option键 + 双击代码会显示该代码的帮助文档

7.5 调试

7.6 备忘表

按键 描述
Command + [ 左移代码块
Command + ] 右移代码块
Tab键 接受代码自动完成提示
Esc键 显示代码提示菜单
Control  +  .(半角句号) 循环浏览代码提示
Shift + Control + .(半角句号) 反向循环浏览代码提示
Command + Control + S 创建快照
Control + F 前移光标
Control + B 后移光标
Control + P 移动光标到上一行
Control + N 移动光标到下一行
Control + A 移动光标到本行行首
Control + E 移动光标到本行行尾
Control + T 交换光标左右两边的字符
Control + D 删除光标右边的字符
Control + K 删除本行
Control + L 将光标置于窗口正*
Command + Shift +O 显示Open Quickly 窗口
Command + Control + 向上方向键 打开相配套的文件
按住 Option 键双击鼠标 搜索文档
Command + Y 激活/禁用断点
Command + Control + Y 继续运行(在调试器中有效)
F6 跳过
F7 跳入
F8 跳出



第八章 Foundation Kit 介绍


8.1 稳固的Foundation

8.2 使用项目样本代码

8.3 一些有用的数据类型

1. 范围(1)第一个结构体式NSRange

typedef struct _NSRange

{

   unsignedint location;     //存放该范围的起始位置

   unsignedint length;       //该范围内元素的个数

};

(2)创建NSRange有三种方式

第一种,直接给字段赋值

NSRange range;

range.location = 17;

range.length = 4;

第二种,c语言聚合结构赋值

NSRange range = {17,4};

第三种,Cocoa提供的NSMakeRange()

NSRange range = NSMakeRange(17,4);


2.几何数据类型

(1)

struct CGPoint     //存一个坐标(xy

{

   float x;

   float y;

};

创建的快捷函数:CGPointMake()

(2)

struct CGSize     //存长度和宽度

{

   float width;

   float height;

};

创建的快捷函数:CGSizeMake()
(3) struct CGRect     //矩形数据类型,由坐标和大小复合 {     CGPoint origin;     CGSize size; }; 创建的快捷函数:CGRectMake()

8.4 字符串

1. NSString 的stringWithFormat:该方法通过格式字符串和参数来创建NSString。如:NSString *height;height = [NSString stringWithFormat:@"You height is %d feet,%d inches",5,11];2. 在生命方法时添加加号,就是把这个方法定义为类方法。创建一个实例对象或访问一些全局类数据,最好用类方法3. 创建的大部分方法是实例方法,用减号(-)作为前缀进行声明。4. NSString 中的length,返回字符串的字符个数如:NSUInteger length = [height length];5. isEqualToString:返回一个BOOL值表示字符串内容是否相同。如:NSString *thing1 = @"hello 5";NSString *thing2 = [NSString stringWithFormat:@"hello %d",5];if( [thing1 isEqualToString:thing2] ){NSLog(@"They are the Same!");}6. NSString是不可变的,你可以对它执行各种各样的操作,
如:用它生成新的字符串、查找字符或者将它与其它字符串进行比较,但是你不能以删除字符或者添加字符的方式来改变它。 7. NSMutableString为NSString子类,可以改变字符串 8. 可使用类方法stringWithCapacity:来创建一个新的NSMutableString 声明如下:+(id) stringWithCapacity:(NSUInter) capacity; 9. 可用NSMutableString *string = [NSMutableString stringWithCapacity:42]; 创建一个可变字符串。 字符串的大小并不仅限于所提供的容量,这个容量仅是最优值。 10. (1)对可变字符串执行的操作。appendString或appendFormat 如:- (void) appendString : (NSString *) aString; - (void) appendFormat : (NSString *) format,...; appendString :接收参数aString,然后将其复制到接收对象的末尾。 appendFormat :讲格式化的字符串附加在接收字符串末尾。 (2)deleteCharactersInRange:方法删除字符串中的字符。 - (void) deleteCharactersInRange : (NSRange) aRange;

8.5 集合大家族

1. NSArray是一个用来对储存对象的有序列表,可以在NSArray中放入任意类型的对象。甚至可以是其他数组或者字典对象; 2. NSArray的两个限制 (1)只能存objective-c的对象,不能存c语言基本类型数据, 如:int、float、enum、struct和NSArray的随机指针 (2)不能再NSArray中存储nil 3. 可用类方法arrayWithObjects:创建一个新的NSArray。列表结尾家nil表示结束(这就是数组中不能存nil的原因) 如:NSArray *array = [NSArray arrayWithObjects : @"one",@"two",@"three",nil]; 4. 可用数组字面量格式来创建一个数组 NSArray *array2 = @[@"one",@"two",@"three"]; 使用字面量语法不必在结尾处补上nil 5. 有了数组,获得它所包含个数: - (NSUInteger) count; 获取特定索引处·的对象; -(id) objectAtIndex : (NSUInteger) index; 6. 通过字面量访问数组的语法与c语言中访问数组项的语法类似 如:id *myObject = array1[1]; 7. 输出数组中的内容: for(NSInteger  i=0 ; i < [array count] ; i++) { NSLog(@"index  %d  has  %@.", i , [array objectAtIndex : i ] ); } 用数组字面量语法写以上代码 for(NSInteger  i =0 ; i < [array count] ; i++) { NSLog(@"index  %d  has  %@.", i , array [ i ]  ); } 8. NSArray创建的事不可变数组,NSMutableArray是可变数组类 9. NSMutableArray通过类方法arrayWithCapacity来创建新的可变数组: + ( id )arrayWithCapacity : (NSUInterger) numItems; (1)可按如下方法创建可变数组: NSMutableArray *array = [NSMutableArray arrayWithCapacity:17]; (2)使用addObject:在数组末尾添加对象: - (void) addObject : ( id ) anobject; 使用如下循环,添加4个轮胎; for (NSInteger i =0 ; i < 4 ; i++) { Tire *tire = [Tire new]; [array addObject : tire]; } (3)删除特定索引处的对象。假设你不喜欢第二个轮胎,可用removeObjectAtIndex : 来删除它。 - (void)removeObjectAtIndex : (NSUInterger) index; 如:[arrayremoveObjectAtIndex : 1];//第二个轮胎的索引是1 (4)没有可以用来创建NSMutableArray对象的字面量语法 10.NSEnumerator用它来表示集合中的迭代出的对象。要想使用NSEnumerator需通过objectEnumerator向数组请求枚举器: - (NSEnumerator *) objectEnumerator; 可以用这个方法 NSEnumerator*enumerator = [array objectEnumerator]; 11.获得枚举器后,便可以开始一个while循环,每次循环都向这个枚举器请求它的nextObject(下一个对象): - (id) nextObject; 整个循环代码如下所示: NSEnumerator*enumerator = [array objectEnumerator]; while(id thingie = [enumerator nextObject]) { NSLog(@"I found %@ ",thingie) }