2
BOOL areIntDiff(int thing1, int thing2) {
return thing1 - thing2;
}
int main(int argc, const char *argv[]) {
if (areIntDiff(19, 3) == YES) {
NSLog(@"aa");
}
return 0;
}
如上代码(areIntDiff(19, 3)返回的不是YES,而是16,不敢相信。areIntDiff的返回值为BOOL,按理说BOOL只有YES和NO。我猜想是BOOL只是对int的一个define,而YES是1,NO是0。所以此处与YES比较是肯定不安全的,可以与NO比较。
3
枚举可以如下定义,枚举可以用switch-case
typedef enum{
kCircle,
kRectangle,
kEgg
}ShapeType;
7
xcode技巧
双击括号,可以让xcode选中括号之间的全部代码,无论是[或{
删除本行 crtl+a ,ctrl+k
crtl+a 是利用光标跳到行首,ctrl+k是删除光标后的字符
8 foudation kit介绍
可以使用NSMutableArray的+(id) arrayWithCapcity:(NSUInteger) numItems
来创建可变数组,这个容量数值的存在只是让cocoa对代码做一些优化。cocoa既不会把对象预写入数组中,也不会用该容量来限制数组的大小。
经常需要对NSArray的所有成员执行同一个操作。这个时候可以用枚举来做
NSEnumerator *enumerator = [array objectEnumerator];
while(id thingie = [enumerator nextObject]){
NSLog(@"I found %@",thingie);
}
针对上边的需求,我们可以写的更简单一些
[array enumerateObjectUsingBlock:^(NSString* string,NSUInteger index,BOOL *stop){
NSLog(@"I found %@",string);
}]
9
当使用对象的new,alloc方法或者发生copy消息的时候创建一个对象的时候,对象的保留计数器被加1。要新增对象引用的时候会发送retain消息,减少时发送release消息。
当一个对象因为保留计数器归0而被销毁的时候,oc会自动向对象发一条dealloc消息。
10
构造方法的正确写法
-(instancetype)initWithCount:(int)count interval:(int)interval{
//这才是构造的正确写法
if(self = [super init]){
self.count = count;
self.interval = interval;
}
return self;
}
11
对属性使用copy,那么在属性set的时候,会copy一份,生成类似下边的代码
-(void)setName:(NSString*) name{
_name = [name copy];
}
声明了dynamic属性,系统不会为这个属性创建变量、getter方法、setter方法
12
可以在category里添加属性,但是不能添加实例变量,二期属性必须是dynamic的,使用属性的好处是可以使用点表达式来访问getter和setter方法。
selecotor只是方法名称,但是它以oc运行时使用的特殊方式进行编码,以快速执行查询。
13
协议也可以继承父协议
@protocol AProtocol <ParentProtocol>
@end
18 kvc
kvc中的基本调用是-valueForKey:和-setValue:forKey. valueForKey在oc运行时中使用元数据打开对象并进入其中查找信息,在C/C++中是不能这么操作的。通过kvc,没有相关的getter方法也能获取对象值,不需要通过对象指针来直接访问实例变量。
1
[car setValue:@"Harlll" for key:@"name"];
工作流程:首先查找名称的setter方法如-setName,然后调用它并且传递参数@”Harlll”,如果不存在setter方法,就在类中找名为name或者_name
的实例变量然后为它赋值
2
NSLog(@"%@",[car valueForKey:@"modelYear"]);
结果为 1987
%@是用来输出对象的,但是modelYear的值是个int,为什么会输出1987呢?
kvc有自动装箱和拆箱的功能,使用valueForKey时,会自动把标量值(int/float/struct)放入NSNumber或者NSValue中。。
如果要kvc设置标量需要如下操作
[car setValue:[NSNumber numberWithInt:1998] forKey:@"modelYear"];
代码格式化
代码格式化 crtl+i 是Re-Indent(代码缩进),没有AS那么舒服的代码格式化
参考http://timebridge.space/2017/03/23/XCode-8-2-1-ClangFormat-%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85/
完成安装ClangFormat
我的XCode版本是8.3.3
再按照https://github.com/travisjeffery/ClangFormat-Xcode
设置快捷键ctrl+i 以后就可以用ctrl+i来格式化了。
其他
本书源码
源码链接的是https://github.com/Apress/learn-objective-c-on-mac-12
但是我发现https://github.com/zanjs/Learn-Objective-C-Samples 更好一点
cmd+shift+c 打开控制台
下载网上的工程遇到问题,There is no SDK with the name or path ‘Developer/SDKs/MacOSX10.5u.sdk’”。这是程序试图使用10.5的SDK,而机器上又没有安装造成的。
在Target的Preference中设定使用10.12的SDK版本即可。如下图所示,在Build Setting的BaseSdk里设置。
![enter description here][1]
构造类实例
//id 可以指向任何类型对象的指针
id shapes[3];
ShapeRect rect0 = { 0, 0, 10, 30 };
//向Circle类发一个new消息
shapes[0] = [Circle new];
快捷键
1、切换头文件和m.文件,很实用
Command + control+ 上下箭头键
2、go back,回退,干嘛用啊,就是回到你上次打开的页面。
control+command+ 左箭头
go forward 回到你前面打开的页面
control+command+ 右箭头
TIP1
@class可以解决循环依赖问题
xcode tip
查找某个类的方法
输入类名,敲空格,按esc,就会出来这个类的所有方法
按住option键,再点击NSString可以看到帮助文档。
按住option键,双击NSString可以打开API文档
修改变量名 Edit in scope
修改类名 editor-refacotr-rename
快速打开文件 cmd+shift+o
F6 跳过 F7跳入 F8跳出