《Objective-C基础教程》读书笔记

Objective-C简介

Objective-C是一种面向对象的高级编程语言,它扩展了标准的ANSI C编程语言,将Smalltalk式的消息传递机制加入到ANSI C中。它是Apple的OS X和iOS操作系统及其相关API(Application Program Interface)、Cocoa(包含Foundation和AppKit框架,是Mac OS X的应用程序开发环境)和Cocoa Touch(包含Foundation和UIKit框架,是iOS的应用程序开发环境)的主要编程语言。

#import与#include

  • include是C/C++中用来包含结构体、符号常量、函数原型等元素的声明。#import的作用和#include类似,是OC中用来引用其他文件的声明。
  • 两者的区别是#import可以保证头文件只被包含一次,无论此命令在该文件中出现了多少次。但是#include不行,如果不使用头文件卫士
    (Header File Safeguard),当同一个头文件被重复导入,会报重复定义的错误。
// 头文件卫士使用,#ifndef是"if not defined"的简写,“标示”要保证全局唯一
#ifndef 标示
#define 标示
#include XXX.h
#include XXX.h
#endif

BOOL

  • 许多编程语言都支持布尔(Boolean)类型,它指的是可以存储真值和假值得变量类型,C语言拥有布尔类型bool,OC中提供了一个相似的类型BOOL
  • OC中的BOOL实际上是一种带符号的字符类型(signed char)的类型定义(typedef),它使用8位存储空间。
  • BOOL具有YES和NO两个值,OC通过#define指令把YES定义为1,NO定义为0。但编译器并不会将BOOL当做仅仅能保存YES和NO的真正布尔类型,编译器仍然将BOOL认作8位的二进制数。
  • 同C语言一样,OC中0为false,非0都为true。这意味着,BOOL类型的变量不能通过与YES比较来判断其是否为true,因为YES就是1,不等于1并不能表示其为true或false。可以和NO进行比较,因为NO是0,如果不等于NO,就是不等于0,也就是true。
  • 如果不小心将一个大于1字节的整型值(int或short)赋给一个BOOL类型的变量,那么只有低位的字节会用作BOOL值
// 为BOOL值赋值int,并打印的过程演示
// 提示:计算机中存储数据和数据计算时用的都是对应的补码,int型是32位二进制
/******************赋值小于1字节时**********************/
BOOL bool01 = 127;
// 初始值127是32位正整数,其补码与原码相同
// 32位原码:0000 0000 0000 0000 0000 0000 0111 1111
// 32位补码:0000 0000 0000 0000 0000 0000 0111 1111

 // 给BOOL值赋值时,是将32位赋值给8位,高位赋值给低位直接截取
 // 32位截取8位后的补码:0111 1111
        
 // 打印时,是将BOOL值赋值给32位,再转成原码输出,这里8位的补码是正数,低位转高位时前面补0
 // 赋值给32位时的补码:0000 0000 0000 0000 0000 0000 0111 1111
 // 赋值给32位的原码:  0000 0000 0000 0000 0000 0000 0111 1111  最后转成十进制输出是127
        
 NSLog(@"bool01 = %d", bool01);
  // %d是指按带符号32位二进制的数字转成十进制输出

 BOOL bool02 = 128;
 // 32位原码:0000 0000 0000 0000 0000 0000 1000 0000
// 32位补码:0000 0000 0000 0000 0000 0000 1000 0000
// 8位截取后的补码:1000 0000 截取后变成负数
// 打印时8位转32位,由于低位是负数,转高位时补1
// 赋值给32位的补码:1111 1111 1111 1111 1111 1111 1000 0000
// 赋值给32位的原码:1000 0000 0000 0000 0000 0000 1000 0000  最后转成十进制是-128
NSLog(@"bool02 = %d", bool02);
 
 /******************赋值大于1字节时**********************/
 BOOL bool03 = 256;
// 32位原码:0000 0000 0000 0000 0000 0001 0000 0000
// 32位补码:0000 0000 0000 0000 0000 0001 0000 0000
// 8位截取后的补码:0000 0000
 // 赋值给32位的补码:0000 0000 0000 0000 0000 0000 0000 0000
 // 赋值给32位的原码:0000 0000 0000 0000 0000 0000 0000 0000  最后转成十进制是0
 NSLog(@"bool03 = %d", bool03);
控制台打印信息

启动参数

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // ...
    }
    return 0;
}
  • 上面代码为一个OC程序的主函数,其中argc为启动参数的个数,argv[]为启动参数的数组
  • argue[0]为程序名,所以argc至少是1
  • 在Xcode中为程序添加启动参数:Product -> Edit Scheme -> Arguments ->Arguments Passed On Launch


    添加启动参数.png

方法的调用

  • 方法的调用又被称为发送消息,一般形式如下:
[obj message];

它可以理解为向obj这个对象发送了一条message消息。

  • 当这条消息发出时,obj对象会根据其内部的isa指针找到它对应的类,再通过类中指向在类中定义的方法的代码的指针,找到能够响应这条消息的方法并执行(如果没有找到,会到其超类中寻找,以此类推直到NSObject)
  • 在OC中调用方法时(发送消息时),一个名为self的隐藏参数将被传递给接受对象,而这个参数的引用就是该接受对象。例如上面执行的[obj message]中,obj作为其self参数进行传递。这个隐藏参数的作用是,当方法中引用实例变量时,实际上做的是类似于下面的操作(假设property为obj的一个实例变量):
    self -> property
  • OC中为什么不直接通过对象指向各自的代码,而非要通过类对象?其实有很多OOP的系统的确是这样做的,但是拥有类对象的好处也是非常明显的,当在运行时改变某个类,则该类的所有对象都会自动继承这些变化

面向对象的原则(Open/Close Principle)

对扩展开放,对修改关闭

继承

  • OC中只支持单继承,不支持多继承。OC可以通过Category和protocol来实现多继承的效果
  • super是编译器提供的一个功能,当向super发送消息时,实际上是向OC请求向该类的超类发送消息,如果该类的超类没有定义这个消息,就会沿着继承链继续往上寻找

NSLog( )打印对象

  • NSLog( )可以使用%@说明符来输出对象,从本质上讲,利用NSLog( )输出对象就相当于NSLog( )给对象发送了一条description消息,输出内容即为description方法的返回值
  • 可以通过重写类的description方法来实现NSLog( )输出对象时,打印出我们需要了解的内容

存取方法名规范(getter/setter)

  • setter方法会根据需要修改的属性名来命名,并加上set前缀,书写采用驼峰式,例如setName:、setSex:等
  • getter方法是以其返回的属性名来命名,上面的setter方法对应的getter方法名为name,sex
  • 注意不要将getter方法加上get前缀,get前缀在OC中具有特殊的意义。如果get前缀出现在Cocoa的方法名中,就意味着这个方法会将参数作为指针来返回数值。例如NSData中getBytes:方法,它的参数就是用来存储字节的内存缓冲区的地址。

// 未完待续。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

  • 1.编译程序(1)gcc xx.c,他会默认生成一个a.out的可执行文件,在a.out所在目录,执行./a.o...
    萌面大叔2阅读 1,260评论 0 1
  • C语言基础 编译程序 gcc xx.c,他会默认生成a.out的可执行文件,在a.out所在目录,执行./a.ou...
    帅碧阅读 622评论 1 3
  • 1.编译程序 (1)gcc xx.c,他会默认生成一个a.out的可执行文件,在a.out所在目录,执行./a....
    萌面大叔2阅读 461评论 0 1
  • 我在静静的等待,等待我的2017,如窗外寂静的夜晚,虽然有点黑,有点暗,但是却能让我美美享受床的温暖,掐指一算,2...
    枯藤残鸦阅读 120评论 0 1
  • 猛然想起,即将过的是自己的第二十个教师节。二十,似乎是很重要的一个数字,比如一个孩子二十了,那他就成年了,该独立生...
    雁过留香阅读 608评论 0 2