通过.m扩展名表示文件使用的是Objective-C代码,应由Objective-C编译器处理
#import语句
#import语句来引用头文件,保证头文件只被包含一次,无论这条命令在该文件中出现了多少次
(C语言中:#ifdef来避免一个文件包含另一个文件而后者又包含前者;objective-c用#import实现)
框架
框架是一种把头文件、库、图片、声音等内容聚集在一个独立单元中的集合体。
苹果公司框架集:Cocoa(包括Foundation和Application Kit)、Carbon、QuickTime、OpenGL
Foundation框架处理的是用户界面之下的那些层的特性,比如数据结构和通信机制
NSLog()和@“字符串”
作用和C中的printf()比较像,可以用print f()代替,但是NSLog()可以自动换行
NSString:@是本体
eg:NSLog(@"Hello,Objective-C!");
@意味着引号内的字符应作为Cocoa的NSString元素来处理
NSString支持的功能:长读、与其他字符串比较、将自身换成整型值或者浮点值
布尔类型
C:true false
Objective-C:YES NO 占8位
实际上是一个signed char类型 通过#define将YES定义为1 NO为0
如果是一个更大的整型值赋给了BOOL 那么取低8位
面向对象
OOP:面向对象编程
对象:一种包含值和指向其类的隐藏指针的结构体
实例:对象的另一种称呼
“间接”:编写一段代码来完成别的任务
OOP中,不再重点关注函数,专注数据;数据通过间接方式引用代码,代码可以对数据进行操作。
id:是一种 泛型,可以用来引用任何类型的对象
[]:通知某个对象该去做什么,方括号中第一项是对象,其余部分是需要对象执行的操作
(☝️发送消息/调用方法)
接口:类为对象提供的特性描述
实现:使接口能正常工作的代码
@interface Circle:新类Circle的接口
-:方法的声明
- (void) setBounds: (ShapeRect) bounds;
-(void):声明一个新方法 返回值为void
setBounds: :setBounds是方法名 ‘:'是说后面会出现参数
(ShapeRect) bounds:参数名和参数类型
如果有参数就用冒号,如果没有就不需要
@implementation 使对象能运行的代码位于@implementation中
类名出现在@implementation后 结尾不需要分号 方法后也不需要
@implementation Circle
-(void) setFillCollor: (ShapeColor) c
{
fillColor = c;
}
不必按照interface的顺序来,而且可以新写 当作似有方法
接口是展示类的构造,实现是实现接口声明的方法
继承
用于声明新类的的语法:
@interface Circle: NSObject
冒号后边的标识符是需要继承的类
超类/父类:继承的类
子类/孩子类:执行继承的类
继承的方法调度:
先在子类中查找相应的方法 ,如果找不到,就到对象的超类中找,以此类推,在继承链中寻找,如果在最顶层NSObject类中也没找到,就会出现一个运行时错误,以及编译时的警告信息
如何访问实例变量:
重写方法:
正常:父类的方法为空,子类的方法进行定义,直接调用重写后的方法
0super:既能重写方法的实现,又能调用超类中的实现方法
[super setFillerColor: c]
向super发消息的时候,实际上是在请求向该类的超类发送消息,如果超类中没有定义该消息,就会继续向继承链的上一级中查找
复合
建立类之间的关系,组合多个对象,让他们分工协作
accessor:读取或者改变某个对象属性的方法
getter:通过对象自身访问对象属性的方法
继承和复合:
继承是:is a
复合是:have a
源组织文件
.h文件:存放接口部分代码:@interface指令、公共struct定义、enum常量、@defines、extern
.m文件:实现内容:@implementation指令、全局变量的定义、私有struct
如果扩展名是.mm:编译器会认为是Objective-C++编写的代码,可以同时使用C++和Objective-C来编程
@class:前向引用
告诉编译器:trust me 以后自然会知道这个是什么;也可以循环引用如果在A. h 文件中使 用@class B , 在 B . h 中 使 用@class A , 那 么 这 两 个 类 就 可 以 互 相 引 用 了 。
引用子类的时候不能使用@class ,要用@import
Runtime
运行时 程序在运行的时候可以改变结果(引进新函数 删除存在的函数)
runtime就是一组API
.m文件执行clang -rewrite-objc main.m会生成.cpp文件 即编译后的文件
属性和对象没有存在在实例对象里,只存在在类对象里
SEL:方法编号
IMP:函数指针,保存了方法的指针
Method:SEL,IMP,类型描述字符串
类的动态配置
消息传递
消息的发送
找到IMP
objc——msgSend:消息的接受者,消息的方法名,
消息的转发
找不到IMP后的一系列操作