-
参考
-
启程
- Xcode
-
对C的扩展
- 最简单的Oc程序
- main.m
- m=message
- 解构Hello world
-
import
- 框架
- NSLog()和@
-
- 布尔类型
- 最简单的Oc程序
-
面向对象编程的基础知识
-
间接??
- 变量和间接
- 使用文件名的间接
-
在面向对象编程中使用间接
- 过程式编程
- enum 不需要类型
- struct 需要类型
- 实现面向对象编程
- 过程式编程
-
有关术语
- class
- object
- instance
- message
- method
- methoddispather
- interface
- implementation
-
OC预研中的OOP
- @interface
@interface Circle :NSObject{
@private
ShapeColor fillColor;
ShapeRect bounds;
}- (void) setFillColor:(ShapeColor) fillColor;
- (void) setBounds:(ShapeRect) bounds;
- (void) draw;
@end
- 中缀法
- [circle setFillColor:kRedColor];
- [textThing setStringValue:@"hello there" color:kBlueColor];
- @implementation部分
@implementation Circle- (void) setFillColor:(ShapeColor)c {
fillColor = c;
} - (void) setBounds:(ShapeRect)b {
bounds = b;
}
//(NSString) str:(ShapeColor)c {
// return @"Ns";
//} - (void) draw {
NSLog(@"drawing a circle at (%d,%d,%d,%d) in %@",bounds.x,bounds.y,bounds.width,bounds.height,@"fillColor");
}
@end
- (void) setFillColor:(ShapeColor)c {
- 实例化对象
- 类数组的定义
- id shapes[3];
- shapes[0] = [ Circle new ];
- 类的初始化和调用
ShapeRect r1 = {0,0,30,10};
shapes[0] = [Circle new];
[shapes[0] setBounds: r1];
[shapes[0] setFillColor: kGreenColor];
[shapes[0] draw];- [ shapes[0] setBounds: rect0 ]
- 对象方法调用
- [ shapes[0] setBounds: rect0 ]
- 类数组的定义
- 扩展Shape-Object对象
- @interface
-
-
继承
-
为何使用继承
- 合并多个相似类的接口
- 只完成不同的方法,公用相同的方法
-
继承和模板
- 继承是简化相似对象
- 模板是简化相似类型
-
集成的语法格式
@interface Shape1 :NSObject{
ShapeColor fillColor;
ShapeRect bounds;
}- (void) setFillColor:(ShapeColor) fillColor;
- (void) setBounds:(ShapeRect) bounds;
- (void) draw;
@end
@implementation Shape1 - (void) setFillColor:(ShapeColor)c {
fillColor = c;
} - (void) setBounds:(ShapeRect)b {
bounds = b;
}
//(NSString) str:(ShapeColor)c {
// return @"Ns";
//} - (void) draw {
NSLog(@"drawing a circle at (%d,%d,%d,%d) in %@",bounds.x,bounds.y,bounds.width,bounds.height,@"fillColor");
}
@end
@interface Egg : Shape1
@end
@implementation Egg
-(void) draw {
NSLog(@"drawing a Egg at (%d,%d,%d,%d) in %@",bounds.x,bounds.y,bounds.width,bounds.height,@"egg");
}
@end- @interface Circle :NSObject
- @end
- 术语
- 父类
- 子类
-
集成的工作机制
- 方法调度
- 先调用子类的实现
- 子类没有实现,调用父类的实现
- 实例变量
- 通过基地址偏移来获取变量
- 方法调度
-
重写方法
- super关键字
- 可以在重写时调用超类的方法
- 子类重写方法来解决问题的具体实现
- super关键字
-
-
复合
@interface Tire : NSObject- (NSString *) desc1;
@end
@implementation Tire - (NSString *) desc1
{
return @"I am Tire";
}
@end
@interface Unicycle: NSObject {
Tire *tire;
}
@end- 什么是复合
- 就是在类中引用其他的类
- 通过实例的指针来完成
- 自定义NSLog()
- 类的描述
- description方法重写,会在打印类的时候调用这个方法
- 类的描述
- 存取方法
- 增加set
- get
- 扩展CarParts程序
- 复合还是继承
- 类似的东西用继承
- 不同的东西整合为一个需要用复合
- (NSString *) desc1;
-
源文件组织
- 拆分接口和实现
- 分拆header头文件为.h结尾
- 具体实现的文件.m结尾
- 在m中通过import 头文件.完成定义和实现的绑定
- 拆分Car程序
- 使用跨文件依赖编译
- 重新编译须知
- 通过import来解决依赖关系
- 通过@class Tire来解决依赖时编译问题.跟import类似.
- 只适用于通过指针来使用的方式
- 继承的时候还需要使用import来完成
- 让汽车跑一会
- 分拆头文件和实现
- 根据功能来做分拆
- 导入和继承
- 继承的时候需要使用import来导入头文件
- 重新编译须知
- 拆分接口和实现
-
深入了解Xcode
- 窗口布局一览
- 工具栏
- 导航栏
- 编辑面板
- 检查器
- 调试器
- 库面板
- 改变公司名称
- 使用编译器技巧
- 导航面板
- 源文件
- 链接的框架
- Products
- 多标签
- 导航面板
- 在Xcode的帮助下编写代码
- 首行
- command+[ 缩进
- 代码自动完成
- Tab键
- ctrl+. 翻页
- 括号配对
- 批量编辑
- command+shift+F
- 代码导航
- control+F 向前
- control+B 向后
- control+P 向上
- control+N 向下
- control+A 最开始
- control+E 最末尾
- control+T 交换
- control+D 删除右边的字符
- control+K 删除当前行
- control+L 让光标在正中心
- command+shift+o 快速打开文件
- 辅助窗口可以绑定头文件和顶部文件
- Command+control+向上箭头
- 集中精力
- 使用导航条
- 首行
- 调试
- 暴力测试
- Xcode的调试器
- 增加断点
- 开始运行
- 进入debug模式
- Command +Y 激活和禁用断点
- Command+control+Y 继续运行
- F6 跳过
- F7 跳入
- F8 跳出
- 精巧的调试符号
- 开始调试
- 检查程序
- 备忘录
- 窗口布局一览
-
Foundation Kit
- 稳固的Foundation
- 基于CoreFoundation,纯C完成
- 面向数据的简单类和数据类型
- 使用项目样板代码
- @autoreleasepool
- 自动释放内存关键字
- 有用的数据类型
- 范围
- NSRange
- NSRange range={17,4};
- 集合数据类型
- CGPoint
- CGSize
- CGRect
- 范围
- 字符串
- 创建
- NSString
- stringWithFormat
- 类方法
- 方法属于类,不属于某一个对象
- 声明时第一个字符为+号来标识为类方法
- 最后定义的省略号标识可以接受很多个参数
- 大小
- length
- 实例方法,功能对象绑定而不是类
- 字符串比较
- isEqualToString
- compare
- 不区分大小写
- NSCasensensitiveSearch
- NSLiteralSearch
- NSNumricSearch
- 包含
- hasPrefix
- hasSuffix
- rangeOfString
- 可变性
- MSMutablestring
- appendSring
- appendFormat
- 创建
- 集合大家族
-
NSArray
void test_array2() {
NSArray *array = @[@"one",@"two",@"three"];
for(int i=0;i<[array count];i++) {
NSLog(@"index %d has %@.",i,[array objectAtIndex:i]);
}
}
void test_array3() {
NSString *string=@"lijunjie:linian:jingyanli:mama";
NSArray *chunks = [ string componentsSeparatedByString: @":"];
string = [chunks componentsJoinedByString: @"+"];NSLog(@"%@",string);
}
- Cocoa 类
- 可以存放任意类型的oc对象
- 限制
- 不能存储c语言原始类型
- 不能存放nil
- arrayWithObjects
- NSArray *array2 = @[@"one",@"two",@"three"];
-
可变数组
- NSMutableArray
-
枚举
- NSEnumerator
- 对数组进行遍历
-
快速枚举
- in关键字来遍历
-
NSDirectory
void test_map1() {
Tire *t1 = [ Tire new ];
Tire *t2 = [ Tire new ];NSDictionary *tires = [NSDictionary dictionaryWithObjectsAndKeys:t1,@"t1",t2,@"t2", nil]; NSDictionary *tires2 = @{@"t1":t1,@"t2":t2}; NSLog(@"t1,%@",tires[@"t1"]); NSLog(@"t2,%@",tires2[@"t2"]);
}
-
请不要快来
-
- 其他数值
- NSNumber
- (NSNumber *) numberWithChar:(char) value;
- (NSNumber *) numberWithInt: (int) value;
- NSNumber *number;
- number = @'x' //char
- number = @123456//int
- number = @12345ul//unsigned long
- number = @1234ll//long long
- number = @1245.5f //浮点型
- number = @YES;
- NSValue
- 可以包装struct,装入array中
- NSNull
- 可以放入一个nil到map中
- null的包装类
- NSNumber
- 稳固的Foundation
-
内存管理
- 对象生命周期
- 什么是对象的生命周期
- 创建 alloc new
- 生成
- 交友
- 释放
- 引用计数
- alloc new copy 对象计数+1
- release 对象计数-1
- 重写dealloc 可以释放自己的资源
- init方法是构造函数
- dealloc是析构函数
- 对象所有权
- 访问方法中的保留和释放
- 自动释放
- 所有对象放入池中
- 自动释放池中的销毁时间
- 自动释放池的工作流程
- 什么是对象的生命周期
- Cocoa的内存管理规则
- 临时对象
- 拥有对象
- 垃圾回收
- 自动引用计数
- 异常
- 与异常有关的关键字
- 捕捉不同类型的异常
- 抛出异常
- 异常也需要内存管理
- 异常和自动释放池
- 对象生命周期
-
对象初始化
- 分配对象
- 初始化对象
- 编写初始化方法
- 初始化时要做些什么
- 便利初始化函数
- 更多部件改进
- Tire类的初始化
- 更新main函数
- 清除Car类
- Car类的内存清理
- 指定初始化函数
- 子类化问题
- Tire类的初始化函数改进后的版本
- 添加AllWeatherReadial类的初始化函数
- 初始化函数规则
- 分配对象
-
属性
- 使用属性值
- 简化接口代码
- 简化实现代码
- 点表达式的妙用
- 属性扩展
- 名称的使用
- 只读属性
- 自己动手有时更好
- 特性不是万能的
- 使用属性值
-
类别
- 创建类别
- 开始创建类别
- @interface部分
- @implementation部分
- 类别的缺陷
- 类别的优势
- 类扩展
- 利用类别分散实现代码
- 通过了捏创建前向引用
- 非正式协议和委托类别
- ITunesFinder项目
- 委托和类别
- 响应选择器
- 选择器的其他应用
- 创建类别
-
协议
- 正式协议
- 声明协议
- 采用协议
- 实现协议
- 复制
- 复制Engine
- 复制Tire
- 复制Car
- 协议和数据类型
- Objective-C 的新特性
- 委托方法
- 正式协议
-
代码块和并发性
- 代码块
- 代码块和函数指针
- Objective-C变量
- 并发性
- 同步
- 队列也要内存管理
- 操作队列
- 代码块
-
AppKit
- 构建项目
- 穿件委托文件的@interface部分
- InterfaceBuilder
- 设计用户界面
- 创建连接
- 连接输出口
- 连接操作
- 应用程序委托的实现
-
UIKit
- 视图控制器
-
文件加载与保存
- 属性列表
- NSDate
- NSData
- 写入和读取属性列表
- 修改对象类型
- 编码对象
- 属性列表
-
键/值编码
- 入门项目
- KVC简介
- 建路径
- 整体操作
- 批处理
- nil仍然能用
- 处理未定义问题
-
使用静态分析器
- 静态工作
- 开始分析
- 协助分析器
- 静态工作
-
NSPredicate
- 创建谓词
- 计算谓词
- 数组过滤器
- 格式说明符
- 运算符
- 有Self就足够了
- 字符串运算符
- LIKE运算符
-
属性
- 语法 @Property
- @property (copy, nonatomic, class) NSString *shareExtensionGroupIdentifier;
- 作用,自动生成shareExtensionGroupIdentifier 变量的存储器
- 例子
- @property(nonatomic,strong) NSString *carName; //定义
- @synthesize carName; //实现
- @synthesize 可以隐藏存储器
- 点方案
- car.carName = @"Jeep Compass" //赋值
- car.carName //获取
- 消息方案
- [car setCarName:@"Jeep Compass"];
- [car carName]
- 可以只定义,不实现,增加@property也可以直接使用
- _carName
- _+属性名
- 自定义存取名字,不用默认
- @synthesizecarName = i_am_car_name;
- 关键字
-
原子性
- atomic
- 默认
- 原子性
- 线程安全
- nonatomic
- 非原子性
- atomic
-
存取器控制
- readonly
- 只读
- readwrite
- 默认
- 可读写
- @property(nonatomic, setter = mySetter:,getter = myGetter ) NSString *name;
- readonly
-
内存管理
- assign
- 默认
- retain
- 对传入对象进行引用计数+1
- 所有权归传入的对象,只要这个对象不释放,就不被销毁
- strong
- weak
- copy
- assign
-
- 语法 @Property
网友评论