说明 | |
---|---|
首次发布 | 2019年01月11日 |
最近更新 | 2019年04月20日 |
前言:现在公司的项目没有需求,趁着这个机会,系统地总结一下过去积累的Xcode使用经验。算是做个笔记,也希望对后来开发者有所帮助。
1、遇到错误,仍然接着编译
2、xib或sb里换行:Ctrl + Enter
3、符号断点:针对某一个方法设置断点并暂停执行。符号断点的规则是:实例方法 -[类名 实例方法名]
,类方法是 +[类名 方法名]
。
作为优化,一般写一个BaseViewController
,当然也看个人习惯。
4、条件断点:默认为空,表示走到断点位置,就做相应的操作。也可以在Condition
里输入断点条件,只有在符合条件的断点处执行。
5、重构
这里简单拓展一下OC中,函数Function与方法Method(下面代码为函数和方法的实例)的异同点:
-
- 相同点:
- a. 都是用来封装一段相对独立的功能的代码;
- b. 只要被调用,封装在其中的代码就会被自动执行;
-
- 不同点:
- 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作用:
- Category 可以有 N 个,Extension 也可以有,且它不限于写在 .m 中,只要在 @implementation 前定义就可以,我们可以利用这个性质,
将 Header 中的声明按功能归类
,如下代码所示:
- Category 可以有 N 个,Extension 也可以有,且它不限于写在 .m 中,只要在 @implementation 前定义就可以,我们可以利用这个性质,
// 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
- 解决接口暴露问题,即,将对公业务和对私业务用 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
总结:
-
- 成员变量:
- a. 成员变量的默认修饰是@protected。
- b. 成员变量不会自动生成set和get方法,需要自己手动实现。
- c. 成员变量不能用点语法调用,因为没有set和get方法,只能使用->调用。
-
- 属性
- 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 |