Object-C开发之——学习大纲
前言
历史
- Objective-C诞生于 20 世纪 80 年代
- 由Brad Cox 发明
简介
- C语言的基础上,增加了一层最小的面向对象语法
- 完全兼容C语言
- 可以在OC代码中混入C语言代码,甚至是C++代码
可以用来做什么
- 可以使用OC开发Mac OS X平台应用程序
- 可以使用OC开发ios平台的应用程序
入门
开发环境配置
- Mac OS环境
- Xcode
第一个ObjectC程序
创建
- 创建一个Xcode项目
- 选择Mac OS下的Command Line Tool
- 输入项目名称和选择语言(Object-C)
- 选择代码存放位置
编译运行
过程
1、.m文件
2、编译成.o文件
3、链接a.out 可执行文件
运行
点击左上角的编译运行按钮运行
终端指令
1 | //1-编译 |
项目介绍
Foundation
- 开发OC、iOS、Mac程序必备的框架
- 此框架中包含了很多常用的API(应用程序接口)
- 框架中包含了很多头文件,若想使用整个框架的内容,包含它的主头文件即可
autoreleasepool
- 自动释放池
- 自由的管理内存
NSLog
打印输出
与printf的区别:
NSLog
- NSLog接收OC字符串作为参数
- NSLog输出后会自动换行
- 使用NSLog需要
#import<Foundation/Foundatin.h>
printf
- printf接收C语言字符串作为参数
- printf输出后不会自动换行
- 使用printf需要
#include<stdio.h>
#import的作用
- 跟#include一样,用来拷贝某个文件的内容
- 可以自动防止文件内容被拷贝多次
文件类型
h文件
- 头文件
- 用来定义类,实例变量及类中的方法等定义信息(interface)
.m文件
- 源文件
- 定义方法体,可实现object-c和c方法(implemention)
.mm文件
- c++源文件
语法
关键字
特点
基本上所有关键字都是以@开头
分类
带@关键字
类使用
- @interface
- @implementation
- @end
- @class
成员变量
- @property
- dynamic
- @synthesize
可见性
- @public
- @protected
- @private
协议
- @protocol
- @optional
- @required
selector
不带@关键字
类、对象
- self(实例方法中self指代本类的实例对象、类方法中self指代类对象)
- super(super相当于调用父类的方法)
- id(指向对象的指针)
ARC
- __strong(指定该属性对赋值对象持有强引用、该对象就不会自动回收)
- __weak(该对象可能被回收)
其他
- __block:块,是一个独立的逻辑处理单元
- _cmd:表示当前方法的slector
注释
- 单行注释
- 多行注释
数据类型
基本数据类型
- char
- int
- float
- double
- BOOL
nil
- 相当于NULL
- 值为0
字符串
字符串创建
- 字符串的快速创建(NSString *str=@“hello”;)
- 使用静态方法创建
字符串输出
语法
面向对象
常用术语
- 面向过程:Procedure Oriented
- 面向对象:Object Oriented,简称OO
- 面向对象编程Object Oriented programming,简称OOP
定义OC的类
类的声明
- 使用@interface声明一个类
- @interface的大括号{}中声明的变量
- @public修饰变量的可访问性
- 继承自NSObject
类的实现
@implemention实现类中声明
OC中的对象
- 对象创建:[Car new]
- 对象调用
面向对象的特征
封装
继承
继承的专业术语
- 父类\超类 superclass
- 子类 subclass\subclasses
继承的细节
- 单继承
- 子类和父类不能有相同的成员变量
- 方法的重写
super关键字
分别调用父类的对象方法和类方法
继承的好处与坏处
- 好处:1.不改变原来模型的基础上,拓展方法。2.建立了类与类之间的联系。 3.抽取了公共代码
- 坏处:耦合性强
适用场所
- 它的所有属性都是你想要的,一般就继承
- 它的部分属性是你想要的,可以抽取出另一个父类
多态
概念
- 某一类事物的多种形态
- OC对象 具有多态性
多态的体现
- 子类对象赋值给父类指针
- 父类指针访问对应的属性和方法
多态的好处
父类接收参数,节省代码
多态的局限
不能访问子类的属性(可以考虑强制转换)
多态的细节
动态绑定:在运行时根据对象的类型确定动态调用的方法
分类—Category
概念
在不改变原来类模型的前提下,给类扩展一些方法
方式
- 继承
- 分类(Category)
格式
- 分类的声明:@interface类名(分类名称)
- 分类的实现:@implementation类名(分类名称)
好处
- 一个庞大的类可以分模块开发
- 一个庞大的类可以由多个人来编写,更有利于团队合作
类
类也是个对象
- 其实类也是一个对象,是Class类型的对象,简称“类对象”
- Class类型的定义
- 类名就代表着类对象,每个类只有一个类对象
+load和+initialize
+load
- 在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法
- 先加载父类,再加载子类;也就是先调用父类的+load,再调用子类的+load
- 先加载元原始类,再加载分类
- 不管程序运行过程有没有用到这个类,都会调用+load加载
+initialize
- 在第一次使用某个类时(比如创建对象等),就会调用一次+initialize方法
- 一个类只会调用一次+initialize方法,先调用父类的,再调用子类的
获取类对象的2种方式
- Class c = [Person class]; // 类方法
- Person *p = [Person new];Class c2 = [p class]; // 对象方法
方法
方法的声明
- 不带参数的方法
- 带参数的方法
方法的实现
set方法和get方法
description方法
- -description方法
- + description方法
对象方法和类方法
类方法
特点
- 以加号+开头
- 只能用类名调用,对象不能调用
- 类方法中不能访问实例变量(成员变量)
使用场所
当不需要访问成员变量的时候,尽量使用类方法
对象方法
- 以减号-开头
- 只能让对象调用,没有对象,这个方法根本不可能被执行
- 对象方法能访问实例变量(成员变量)
NSLog输出增强
1 | __FILE__:源代码文件名 |
句法
语句
循环语句
- do while
- while
- for
条件语句
- if
- else if
选择语句
- switch
高级应用
内存管理
什么是内存管理
- 移动设备的内存极其有限,每个app所能占用的内存是有限制的
- 当占用的内存较多时,系统会发出内存警告,这时回收一些不需要再使用的内存空间
管理范围
- 任何继承了NSObject的对象
- 对其他基本数据类型无效
对象的基本结构
- 每个OC对象都有自己的引用计数器,是一个整数,表示“对象被引用的次数
- 每个OC对象内部专门有4个字节的存储空间来存储引用计数器
引用计数器
引用计数器的作用
- 当使用alloc、new或者copy创建一个新对象时,新对象的引用计数器默认就是1
- 当一个对象的引用计数器值为0时,对象占用的内存就会被系统回收
引用计数器的操作
- 给对象发送一条retain消息,可以使引用计数器值+1(retain方法返回对象本身)
- 给对象发送一条release消息,可以使引用计数器值-1
- 可以给对象发送retainCount消息获得当前的引用计数器值
对象的销毁
- 当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收
- 当一个对象被销毁时,系统会自动向对象发送一条dealloc消息
- 一般会重写dealloc方法,在这里释放相关资源,dealloc就像对象的遗言
- 一旦重写了dealloc方法,就必须调用[super dealloc],并且放在最后面调用
- 不要直接调用dealloc方法
- 一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)
内存管理原则
原则分析
- 只要还有人在使用某个对象,那么这个对象就不会被回收
- 只要你想用这个对象,就让这个对象的计数器+1
- 当你不在使用这个对象时,就让该对象的计数器-1
管理原则
- 谁创建,谁release
- 谁retain,谁release
ARC
基本简介
- ARC是自iOS 5之后增加的新特性
- 完全消除了手动管理内存的烦琐
- 编译器会自动在适当的地方插入适当的retain、release、autorelease语句
基本原理
只要还有一个强指针变量指向对象,对象就会保持在内存中
使用注意
- 不能调用release、retain、autorelease、retainCount
- 可以重写dealloc,但是不能调用[super dealloc]
- @property : 想长期拥有某个对象,应该用strong,其他对象用weak
- 其他基本数据类型依然用assign
- 两端互相引用时,一端用strong、一端用weak
多线程管理
- atomic :性能低(默认)
- nonatomic :性能高
Foundation
常用结构体
- NSRange
- NSPoint/CGPoint
- NSSize/CGSize
- NSRect/CGRect
数组
- 不可变数组NSArray
- 可变数组NSMutableArray
字符串
- 不可变字符串NSString
- 可变字符串NSMutableString
Set集合
- NSSet
- NSMutableSet
字典
- NSDictionary
- NSMutableDictionary
其他
- NSNumber
- NSValue
- NSDate