objective-c基础教程(笔记)

第一章 启航


第二章 对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     //存一个坐标(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)
}



























































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值