这是我参与「第四届青训营 」笔记创作活动的的第1天
主要内容
-
Xcode简介
- Xcode工程体系介绍
- Scheme
- 代码调试工具-LLDB
-
Objective-C基础
- interface与implementation
- 函数及函数调用
- 消息传递
- @property属性
- 协议
Xcode简介
Xcdoe是苹果公司推出的一款集成开发工具。
Xcode工程体系介绍
Xcode工程体系包括:
- Workspace:Workspace 是 Xcode 提供的一个工作空间,其本质是一个容器,不参与任何编译连接过程。Workspace的主要作用是管理相同层级的project(当个 target 被多个不同的项目依赖,或者 project 之间互相引用,那么我们就需要把这些 projects 放到相同的层级上)。
- Project:Project 是一个工程的核心,主要用来管理源代码,资源文件,添加其他三方库等等。
- Target:Target可看做是一个特定的构建目标,构建目标可以是App、命令行工具、二进制库等。每个Target都可以从它隶属的Project中,圈出一批源代码文件或资源文件,然后基于该Target的配置Build Configurations, Build Phase ,执行构建就能得到Target对应的产物 Product,也就是运行的最终结果。(这也是为何需要Workspace作为容器存放多个project的原因)
总结:上述三个概念是依次包含的关系,即一个Workspace可包含多个Project,一个Project可以包含多个Target
Scheme
-
Xcode默认为每一个Target新建一个默认的Scheme
-
Scheme定义了执行特定Target所需要的配置和参数等
代码调试工具-LLDB
-
断点设置:点击想要加入断点的代码位置左侧,点击后会出现蓝色的箭头,再次点击会将断点停用(箭头会变为浅蓝色)。可在断点导航栏中对所有断点进行管理。
-
调试页面
- Debug区:主要包括设备性能以及方法调用堆栈
- 程序控制区:可以进行单步调试,查看视图层和内存分布图
- 对象变量区:可以查看目前的对象或变量(包括临时对象也包括当前被呼叫的对象self)
- 控制台:可以查看断点之前的日志打印或报错信息,也可以输入调试指令。
-
调试指令:
- p/po:p-将右边表达式的计算结果保存在 lldb临时变量中,可供本次调试使用;po-打印右边对象的 debugDescription 方法.
- expression:可简写为e,其后跟OC表达式,可以用来赋值,修改变量值,求表达式结果,调用方法等。
- Breakpoint:可以用set方法设置断点,或者使用delete方法删除断点。
-
程序控制区
-
继续执行,直到碰到下个断点或结束运行。
-
stepover,执行一行代码,保持在当前堆栈正常执行完方法,不进入函数。
-
setpinto,执行一行代码,如果当前行是方法调用,会进入到该方法的堆栈里。
-
stepout,会直接执行到当前方法执行完的堆栈中,即跳出函数。
-
UI视图层级检视。
-
内存分布图。查看到每个对象的内存持有情况,不同对象间的持有关系。
-
Objective-C基础
Objective- C语言是面向对象的编程语言,简称为OC,基于C扩展而来,在OC中使用C语言也是OK的。
interface与implementation
OC中的类包含定义(或称为界面@interface)与实现(@implementation)两个部分。
-
interface:interface中只有声明,可以声明属性,、变量和函数方法,不进行实现。可以写在 .h文件 也可以写在 .m文件。
- 若写在.h文件中则可以被其他文件通过import调用;若写在.m文件中,则只可被该文件中的类调用。
- 一个类可以有多个interface,每个interface要有对应的实现。
-
implementation:实现interface中声明的方法。只能写在.m文件里
- implementation中可添加interface中没有声明的函数或变量,当做私有函数,该私有函数就只有这个implementation区块内可以访问。
函数及函数调用
函数声明的格式:+/- (returnType) methodNameWith: (type) parameter1 andWith:(type) parameter2;
- +/-表是方法类型:+是class method,类似C++静态函数,不需要实例就可调用;-是instance method,需要实例进行调用。
methodNameWith:和andWith:是方法名标签
OC的函数调用
- instance method:
[instanceName method: parameter] - class method:
[className method: parameter]
消息传递
- OC中,调用对象方法,可以看做是一个消息传递过程,即给对象发送一个消息,对象可在运行时才去决定如何处理这条消息
- respondsToSelector与performfromSelector:performSelector是一种调用方法,不会在编译时做任何的较验,需要搭配respondsToSelector使用。使用场景:1). 该方法在运行时透过Runtime添加进来,在编译时不存在;2).调用未在interface中声明的私有方法。
if ([instanceName respondsToSelector:@selector(method)]) {
[instanceName performSelector:@selector(method)];
}
@property属性
-
用属性代替变量,自动生成setter和getter方法
-
可以透过点符号访问属性,相等于访问对应的Get / Set 方法
-
注意区分变量和属性的概念。
//覆盖property自带的set方法 - (void)setName:(NSString *)name { //self.name = [NSString stringWithFormat:@"%@ %@", name, @"!"]; _name = [NSString stringWithFormat:@"%@ %@", name, @"!"]; } @end被注释掉的代码是错误的,因为在set方法里调用了set方法(自己调用自己)。
_name是因为自动声明的变量前是带下划线的。
-
-
Atomicity(原子性):是否给setter和getter加锁(是否保证setter或者getter的每次访问是完整性的)。
- atomic(默认值)
- nonatomic
-
Access(存取特性)
- readwrite(默认值):生成get和set方法
- readonly:只生成get方法
-
Storage(内存管理特性)
- strong:持有属性,只能用于OC对象类型。将property一直放在heap中,直到类不再指向它。
- weak:不持有属性,只能用于OC对象类型。该属性对象可以被销毁,被销毁后,原来的类的属性会置为nil。一般将代理设置为weak解决循环引用问题。
- copy:在赋值前,拷贝一个对象。不管是可变还是不可变对象,都会被拷贝为一个不可变对象。
- assign:直接赋值。该属性对象可以被销毁,被销毁后,原来的类的属性会变为也指针,再访问这些属性,程序就会crash。在ARC下,assign用于修饰基本数据类型(Primitive Type),也就是非对象/非指针数据类型,如:int、BOOL、float等。
- retain:与strong类似,是之前非ARC时代的特性,在ARC下并不常用。
-
协议
协议的目是希望多个不同的类之间都有共通的方法或变量(也就是共通的介面 ),不需要每个类各自的Interface去声明方法。
两种协议模式:
- 委托模式:方法参数从委托方(声明协议,并持有委托对象属性)流向代理方(遵守协议(实现协议))(事件发生时委托者通知代理者)。
- 数据源模式:委托方从代理方拉取数据。委托方只需要构建如何处理这些数据的业务逻辑代码,而不用关心来源,来源由遵守协议的代理方提供。
声明协议:@protocol 关键字,后跟协议名 ,协议名后面的<>内是这个协议继承的另一个协议。遵守此协议的委托对象也可以实现该协议的方法。协议的多继承也很好的弥补了oc不支持多重继承的语言缺陷。