object-c基础教程 读书笔记

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跳出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值