Xcode&Objective-C基础|青训营笔记

180 阅读6分钟

这是我参与「第四届青训营 」笔记创作活动的的第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所需要的配置和参数等

    image-20220727132414822.png

    image-20220727132327670.png

代码调试工具-LLDB

  • 断点设置:点击想要加入断点的代码位置左侧,点击后会出现蓝色的箭头,再次点击会将断点停用(箭头会变为浅蓝色)。可在断点导航栏中对所有断点进行管理。

    image-20220727133108002.png

    image-20220727133436349.png

  • 调试页面

    • Debug区:主要包括设备性能以及方法调用堆栈
    • 程序控制区:可以进行单步调试,查看视图层和内存分布图
    • 对象变量区:可以查看目前的对象或变量(包括临时对象也包括当前被呼叫的对象self)
    • 控制台:可以查看断点之前的日志打印或报错信息,也可以输入调试指令。
  • 调试指令:

    • p/po:p-将右边表达式的计算结果保存在 lldb临时变量中,可供本次调试使用;po-打印右边对象的 debugDescription 方法.
    • expression:可简写为e,其后跟OC表达式,可以用来赋值,修改变量值,求表达式结果,调用方法等。
    • Breakpoint:可以用set方法设置断点,或者使用delete方法删除断点。
  • 程序控制区

    image-20220727134334635.png

    1. 继续执行,直到碰到下个断点或结束运行。

    2. stepover,执行一行代码,保持在当前堆栈正常执行完方法,不进入函数。

    3. setpinto,执行一行代码,如果当前行是方法调用,会进入到该方法的堆栈里。

    4. stepout,会直接执行到当前方法执行完的堆栈中,即跳出函数。

    5. UI视图层级检视。

      image-20220727134920040.png

    6. 内存分布图。查看到每个对象的内存持有情况,不同对象间的持有关系。

      image-20220727134744199.png

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]

消息传递

  1. OC中,调用对象方法,可以看做是一个消息传递过程,即给对象发送一个消息,对象可在运行时才去决定如何处理这条消息
  2. 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是因为自动声明的变量前是带下划线的。

  • property的attribute(属性)

    1. Atomicity(原子性):是否给setter和getter加锁(是否保证setter或者getter的每次访问是完整性的)。

      • atomic(默认值)
      • nonatomic
    2. Access(存取特性)

      • readwrite(默认值):生成get和set方法
      • readonly:只生成get方法
    3. 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不支持多重继承的语言缺陷。