Xcode:使用进阶

说明
首次发布 2019年01月11日
最近更新 2019年04月20日

前言:现在公司的项目没有需求,趁着这个机会,系统地总结一下过去积累的Xcode使用经验。算是做个笔记,也希望对后来开发者有所帮助。

1、遇到错误,仍然接着编译

2、xib或sb里换行:Ctrl + Enter

3、符号断点:针对某一个方法设置断点并暂停执行。符号断点的规则是:实例方法 -[类名 实例方法名],类方法是 +[类名 方法名]

作为优化,一般写一个BaseViewController,当然也看个人习惯。

4、条件断点:默认为空,表示走到断点位置,就做相应的操作。也可以在Condition里输入断点条件,只有在符合条件的断点处执行。

5、重构

这里简单拓展一下OC中,函数Function与方法Method(下面代码为函数和方法的实例)的异同点:

    1. 相同点:
    • a. 都是用来封装一段相对独立的功能的代码;
    • b. 只要被调用,封装在其中的代码就会被自动执行;
    1. 不同点:
    • a. 语法不同;
    • b. 定义的位置不同:方法声明只能写在@interface的大括弧的里面,实现只能写在@implementation之中;函数除了在函数的内部和@interface的大括弧之中,其他的地方都是可以写。
    • c. 调用的方式不同:函数可以直接调用;方法必须通过对象来调用。
    • d. 归属不同:方法是属于类;就算把函数写在类中,这个函数仍然不属于类,所以函数不要写到类中。
// 调用
- (void)viewDidLoad {
    [super viewDidLoad];
    
    printFunction();
    [self printMethod];
}

// 抽出Function
static void printFunction() {
    NSString *hello = @"Whatever";
    NSLog(@"value = %@", hello);
}

// 抽出Method
- (void)printMethod {
    NSString *hello = @"Whatever";
    NSLog(@"value = %@", hello);
}

6、属性断点:编译一下就能出现如图的效果。

7、模拟器去除边框 只需取消勾选Show Device Bezels

8、虚拟和真实文件夹的判别:就看有没有倒三角

9、Xcode10之后,代码块是模态出来的,如果不想这样,可以按住Alt键再点击。

10、Xcode 的 plist:如下图,我们可以在工程 Plist 里随心所欲设置键值(自定义的时候,要避开系统保留的关键字),然后按照下面的方法读取。

NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
NSLog(@"Author is %@", infoDict[@"Author"]); // 打印:Author is 人民重重

拓展
一、Category 和 Extension

在语言机制上的差别:Extension 在编译期就会将定义的 Ivar、属性、方法等直接合入主类,而 Category 在程序启动 Runtime Loading 时才会将属性(没 Ivar)和方法合入主类。

Extension 和 Category 在 AST 中的表示都是 ObjCCategoryDecl,只是有无名字的区别,也可以说 Extension 是匿名的 Category

Extension作用:

    1. Category 可以有 N 个,Extension 也可以有,且它不限于写在 .m 中,只要在 @implementation 前定义就可以,我们可以利用这个性质,将 Header 中的声明按功能归类,如下代码所示:
// Worker.h

@interface Worker : NSObject

@end

// 公司领导层
@interface Worker ()

// 家庭住址
@property (nonatomic, copy) NSString *homeAddress;
// 年终奖
@property (nonatomic, assign) float annualBonus;

@end

// 一线职工
@interface Worker ()

// 考勤
@property (nonatomic, assign) NSInteger attendanceDays;
// 床号
@property (nonatomic, copy) NSString *bedNumber;

@end
    1. 解决接口暴露问题,即,将对公业务和对私业务用 Class Extension 的形式拆到两个 Header 中,这样私有类对私有属性的依赖就被成功隔离开了。如下代码所示:
// Sark.framework/Sark.h
@interface Sark : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *creditCardPassword; // secret!
@end

// Sark.framework/PrivateSarkWife.h
@interface PrivateSarkWife : NSObject
- (void)robAllMoneyFromCreditCardOfSark:(Sark *)sark; // needs password!
@end

问题:假设 Sark.h 是 Sark.framework 唯一暴露的 Header,而 framework 中的一个私有类需要获取这个公共类的某个属性(或方法)该怎么办?

解决方案:上面的 creditCardPassword 属性需要一个对外不可见而对内可见的地方声明,这时候可以利用 Class Extension:

// Sark.h
@interface Sark : NSObject
@property (nonatomic, copy) NSString *name;
@end

// Sark+Internal.h <--- new
@interface Sark ()
@property (nonatomic, copy) NSString *creditCardPassword;
@end

// Sark.m
#import "Sark.h"
#import "Sark+Internal.h" // <--- new

使用Extension:

// PrivateSarkWife.m
#import "PrivateSarkWife.h"
#import "Sark+Internal.h" // <--- 私有依赖

@implementation PrivateSarkWife
- (void)robAllMoneyFromCreditCardOfSark:(Sark *)sark {
    NSString *password = sark.creditCardPassword; // oh yeah!
}
@end
二、变量和属性

示例代码:

#import "Worker.h"

@interface Worker () {
    // 变量
    NSString *variableString;
}
// 属性
@property (nonatomic, copy) NSString *propertyString;

@end

@implementation Worker

- (instancetype)init {
    if (self = [super init]) {
        self.propertyString = @"propertyString";
        self->variableString = @"variableString";
    }
    return self;
}

@end

总结:

    1. 成员变量:
    • a. 成员变量的默认修饰是@protected。
    • b. 成员变量不会自动生成set和get方法,需要自己手动实现。
    • c. 成员变量不能用点语法调用,因为没有set和get方法,只能使用->调用。
    1. 属性
    • a. 属性的默认修饰是@protected。
    • b. 属性会自动生成set和get方法。
    • c. 属性用点语法调用,点语法实际上调用的是set和get方法。
三、快捷键

注意:快捷键都是唯一的。如果快捷键与系统或其他应用的快捷键冲突,则可能导致快捷键失效,特此说明。

常用快捷键 作用
Cmd + +/- 缩放字体
Cmd + R 运行应用程序
Cmd + B 构建应用程序
Ctrl + . 停止运行中的应用程序
Ctrl + i 格式化代码
Cmd + Alt + / 详细注释
Cmd + 0 展示/隐藏导航区域
Cmd + 1 到Cmd + n 选择不同的导航器
Cmd + Alt + J 过滤导航结果
Cmd + Shift + Y 显示/隐藏调试区
Cmd + Alt + 0 显示/隐藏实用工具区
Cmd + Alt + 1 到Cmd + Alt + n 切换实用工具区选项卡
Ctrl + 6 方法的跳转菜单
Ctrl + 1 魔法菜单
Ctrl + Cmd + Up / Down 对应文件导航
Ctrl + Cmd + E 范围内重命名符号(先选中目标
Ctrl + Cmd + Left / Right 查看历史文件
Ctrl + Cmd + J 查看符号来源
Alt + Selection 垂直选择
Alt 修饰符 在辅助编辑器执行快捷键
Cmd + Shift + ] / [ 移动到下一个/上一个的标签
Cmd + Alt + ] / [ 将某行代码向上和向下移动
Cmd + Alt + Enter 辅助编辑器
Cmd + Enter 关闭辅助编辑器
Shift + Cmd + L 控件箱/代码块
Shift + Cmd + M 媒体
Cmd + < 打开scheme

参考

孙老师的博客

你可能感兴趣的:(Xcode:使用进阶)