第一章 启航
第二章 对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 架构
2.有继承后改进的Shape-objective 架构
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,如setEngine
2. 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 //存一个坐标(x,y)
{
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)