programming in objective-c 6th edition总结_第1页
programming in objective-c 6th edition总结_第2页
programming in objective-c 6th edition总结_第3页
programming in objective-c 6th edition总结_第4页
programming in objective-c 6th edition总结_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Chapter 2 Programming in Objective-C 5 Chapter 3 Classes,Objects,and Methods 6 The interface Section.6 Choosing Names .6 Class and Instance Method.7 Method Arguments.8 The implementation Section .8 The program Section 9 Accessing Instance Variable and Data Encapsulation .10 Chapter4 Data Types and Expressions10 Data Types and Constants 10 Type int .10 Type float 10 Type char 11 Type id 11 Integer and Floating-Point Conversions11 The Type Cast Operator 11 Assignment Operator11 Chapter5 Program Looping.12 Chapter6 Making Decisions 12 Compound Relational Tests 12 Boolean Variables .12 The Condition Operator13 Chapter7 More on Classes13 Separate Interface and Implementation Files 13 Synthesized Accessor Methods 13 Accessing Properties Using the Dot Operator 14 Multiple Arguments to Methods 15 Methods without Argument Names .16 Local Variables 16 Method Arguments.16 The static Keyword .16 The self Keyword 16 Allocating and Returning Objects from Methods .17 Chapter8 Inheritance17 It All Begins at the Root 17 Extension through Inheritance: Adding New Methods 18 The class Directive.18 Overriding Methods18 Abstract Classes 19 Chapter9 Polymorphism, Dynamic,Typing, and Dynamic,Binding19 Dynamic Binding and the id Type .19 Compile Time Versus Runtime Checking 20 The id Data Type and Static Typing 20 Argument and Return Types with Dynamic Typing 20 Asking Questions about Classes20 selector 指令 .21 Exception Handling Using try 22 Chapter10 More on Variables and Data Types.22 Initializing Objects.22 Scope Revisited.24 More on Properties, Synthesized Accessors, and Instance Variables.24 Global Variables 25 Static Variables .25 Enumerated Data Types .26 The typedef Statement .26 Data Type Conversions .26 Conversion Rules.27 Bit Operators.27 The Bitwise Exclusive-OR Operator.27 The Ones Complement Operator27 The Right-Shift Operator.27 Chapter 11 Categories and Protocols .28 Categories .28 Class Extensions29 Some Notes about Categories 29 Protocols and Delegation30 Delegation.32 Informal Protocols 32 Composite Objects33 chapter 12 The Preprocessor33 The #define Statement .33 The #import Statement.33 Conditional Compilation .34 The #undef Statement 34 Chapter 13 Underlying C Language Features34 Arrays34 Initializing Array Elements 34 Character Arrays .35 Functions 35 Arguments and Local Variables.35 Returning Function Results.36 Declaring Return Types and Argument Types.36 Functions, Methods, and Arrays .36 Blocks36 Structures .37 Initializing Structures 37 Additional Details about Structures38 Pointers and Structures 38 Pointers and Arrays.39 Pointers to Character Strings 39 Constant Character Strings and Pointers 40 Pointers to Functions 40 Theyre Not Objects!.40 Miscellaneous Language Features 40 Compound Literals40 How Things Work41 Fact 1: Instance Variables Are Stored in Structures41 Fact 2: An Object Variable Is Really a Pointer .41 Fact 3: Methods Are Functions, and Message Expressions Are Function Calls.41 Fact 4: The id Type Is a Generic Pointer Type.42 Chapter 14 Introduction to the Foundation Framework 42 Foundation Documentation42 Chapter 15 Numbers, Strings, and Collections .42 Number Objects43 String Objects44 More on the NSLog Function.44 The description Method44 Mutable Versus Immutable Objects .45 Mutable Strings.46 Array Objects 47 Making an Address Book 48 Fast Enumeration49 Sorting Using Blocks49 The NSValue Class50 Dictionary Objects 50 Enumerating a Dictionary .50 Set Objects51 NSIndexSet52 Chapter 16 Working with Files53 Managing Files and Directories: NSFileManager .53 Working with the NSData Class54 Working with Directories 54 Enumerating the Contents of a Directory.55 Working with Paths: NSPathUtilities.h.55 Common Methods for Working with Paths 55 Copying Files and Using the NSProcessInfo Class 56 Basic File Operations: NSFileHandle56 The NSURL Class .57 The NSBundle Class57 Chapter 17 Memory Management and Automatic Reference Counting58 Automatic Garbage Collection58 Manual Reference Counting .58 Object References and the Autorelease Pool .59 The Event Loop and Memory Allocation.60 Summary of Manual Memory Management Rules.62 Automatic Reference Counting.62 Strong Variables62 Weak Variables .63 autoreleasepool Blocks .64 Method Names and Non-ARC Compiled Code .64 Chapter 18 Copying Objects .65 The copy and mutableCopy Methods .65 Shallow Versus Deep Copying.65 Implementing the Protocol.66 Copying Objects in Setter and Getter Methods66 Chapter 19 Archiving 67 Archiving with XML Property Lists 67 Archiving with NSKeyedArchiver.68 Writing Encoding and Decoding Methods 68 Using NSData to Create Custom Archives 70 Using the Archiver to Copy Objects 70 Chapter 20 Introduction to Cocoa and Cocoa Touch71 Framework Layers.71 Cocoa Touch .72 Chapter 21 Writing iOS Applications 72 The iOS SDK.72 Chapter 2 Programming in Objective-C Objective-C 使用 .m 作为源码文件的后缀名。 Objective-C 也是使用 /和/*/作为注释符,这一点和 C/C+一样。 XCode 不仅有 GUI 界面而且还支持命令行。 Unix 的命令行不同于 Linux 的命令行,它不自动识别当前目录,你必须要 加个./ 才行。 Objective-C 采用 #import 也可以是” ,这一点完全和 C+是一样的,前 者首先在系统头文件中搜索,后者在用户头文件中搜索。 类中的implementation 部分包含的是类的私有信息,这包括类的成员变量 和类的实现代码。 Synthesized Accessor Methods Objective-C 中有专门的属性一说,即,通过porperty 标识的实例变量, 它位于类的interface 中,如下图所示: 一旦你这样做了就无需另在implementation 中再次声明实例变量了。 然后在类的implementation 中用synthesize 来对property 中的变量加以 限定就可以让 XCode 自动产生出它们的存取器(getter 和 setter)。如下图所示: 其实你不写synthesize 部分也能让编译器自动产生存取器,只不过这样产 生的存取器名字前面有个下划线。 我在想这样编译器自动产生存取器会不会造成数据的不安全,当然你可以 选择不写property 部分。 Accessing Properties Using the Dot Operator 所以可以看出在 Objective-C 类中的实例成员通常被称作属性。 想获取某属性成员的值,你可以以以下方式写出来: 如果用存取器的话,你可以如下写出来: 这个其实就是 getter 的变种,同样,也有 setter 的变种,如下所示: 这个你也可以写成非存取器的方式: 普通的方法你也可以点出来,如下图所示: 但是不推荐这样写,因为这种写法是存取属性专用,这种风格可以让你的 代码泾渭分明。 Multiple Arguments to Methods Objective-C 中的多参数的方法的声明式很奇怪,如下所示: 它这个方法的名字不只一个,除了一个 setTo 还有一个 over,然后每个名 字后面跟了一份冒号,冒号后面是形参的类型和名称。可以看出有多少个冒号 就有多少个形参。这种形式的方法可以简写成 setTo:over:它的实现如下所示: 它的使用方式如下所示: Methods without Argument Names 上述这种写法是可选的,因为整个方法名变成了一条消息语句,而不是单 单一个名词而已,这样可读性比较强,不过我个人不太习惯,Objective-C 允许 你按下面这种方式写: 这种方法的调用方式如下所示: 像这样的方法可以简单写成 set:以表示它有两个参数。 Local Variables 未被初始化的对象默认会被初始化为 nil。 Method Arguments 有关函数传参,针对于内置类型而言,这个参数传递机制是值传递。 而对于对象而言则是传递引用。 The static Keyword static 变量没有必要初始化,因为它默认就是 0。 The self Keyword 这是 Objective-C 中的新关键字,它的作用有点像 this 指针,即,对象实例 自身。 你可以用它引用该实例自身的方法,这个方法被称为消息的接收方。 用法如下: 实例如下: Allocating and Returning Objects from Methods 和 C+语言不同,Objective-C 中的函数返回对象时该对象并不是一个临时 对象,而 C+在返回对象时是返回一个临时对象,当这个临时对象被赋给目标 左值对象后就被销毁。 Objective-C 中函数返回对象时其实是把该对象的存储地址返回给了目标左 值对象,更确切地说是个指针,这个行为有点像 C+中的右值引用。 Chapter8 Inheritance It All Begins at the Root 父类中成员变量只有声明在interface 中才能被子类继承,如下图所示: 如果子类想去访问父类implementation 中的成员变量,就应该使用它们的 存取器。 同样,父类的方法,包括实例方法和类方法,也能被子类继承。 Extension through Inheritance: Adding New Methods self.width 也可以写成self width。 myRect.origin.y 可以写成myRect origin y。 The class Directive 这是 Objective-C 里面特有的指令,其作用相当于 C+中的前置声明式,意 思就是说,你用了这个指令,就不用去包含你要用到的类的声明式所在的头文 件了,它的作用是告诉编译器某个东西是个类而已。 其用法如下所示: 它比包含头文件的方式高效,因为后者必须要加载头文件,并且还要处理 正各头文件。 如果你想使用类中的成员变量和成员方法,你还是要#import 那个类所在的 头文件。 Overriding Methods 与传统的 C+不同,Objective-C 允许在implementation 中给成员变量初 始化,如下图所示: 子类覆盖父类的方法和 C+是一样的,所以在这里闲话少叙。 Abstract Classes Objective-C 也是有抽象类的,它通常作为提供给外界的接口,这一点和 C+很像。 不过关于 Objective-C 的详细介绍书中将在后面讲到。 Chapter9 Polymorphism, Dynamic,Typing, and Dynamic,Binding 多态可以使不同类之间定义相同名字的方法。 动态类型是指在程序运行期间判断对象类型。 动态绑定是指在运行期间判断调用某对象的具体方法。 Dynamic Binding and the id Type id 类型的作用其实是能在运行期存储任何类型的对象。 它的用法如下图所示: Compile Time Versus Runtime Checking The id Data Type and Static Typing id 类型变量不能使用点操作符。 Argument and Return Types with Dynamic Typing 就是说方法的参数和返回值也可以是 id 类型的。 不同的类之间可以有同名的方法,但是一定要确保各方法参数的类型都是 一致的,返回值的类型也是一致的。拿返回值来说,要么你都是对象类型,要 么都是同一内置类型,不然编译器就会发出警告,参数类型亦然。 对象类型之间可以不同,因为说到底它们之间传递的是指针,所以与具体 的类型无关。 书中关于这一点说的比较少,我的理解也不一定全面。 Asking Questions about Classes 表 9.1 列举了一些用于判断动态类型的方法。 你可以用类名 class直接获取一个无名对象实例。 你还可以通过对象名 class获取该对象所属的类型名。 判断两个对象类型是否相同,你可以用如下方式: 如果是使用动态类型的判断方法的话可以如下使用: 这条语句的作用就是判断 myFract 是不是 Fraction 类的对象。不知道怎么, 我看着写法就是有些别扭,这个 myFract 不是返回值,而是一个对象, isMemberOfClass 是这个对象的方法, Fraction class是参数。 selector 指令 书中对该指令轻描淡写,也没有这一节,这是我对网上资料的理解。 它相当于取每个方法的编号,有点像函数指针的意思,它返回一个 SEL 类 型的值,不同的方法返回的 SEL 值也不同。 其用法如下所示: 你可以这样用: 你也可以这样用: 这个判断对该对象的各父类也是成立的,即,如果 draw 方法不在 graphicObject 中而在他的父类或者更高层的类中判断的结果也是一样的该 对象可以调用该方法(YES)。 这里面初步涉及到了托管(delegation) 的概念。从书中的简单描述来看,托 管就是一个中间层,它连接了某一事件和处理该事件的若干各方法。 Exception Handling Using try 这就是 Objective-C 中的异常处理,如下图所示: 除此之外还有finally 和throw,前者作为在异常处理中最后肯定被执行 的语句块而存在,后者可以指定你想抛出的异常。 同样 Objective-C 也允许多个 catch 块的出现。 和 C+语言一样,尽量不要用异常处理,能检查出来的错误必须要检查出 来,实在没办法再用异常来结束程序。 Chapter10 More on Variables and Data Types Initializing Objects 这里边的 init 并不是 Fraction 类里面的而是从 NSObject 中继承而来的,换 句话说,Fraction 里面没有自己的 init。 在 Objective-C 中一般把初始化和设置初值写成一个方法。上面 init 并不是 什么系统方法,它只不过就是这样一个方法而已。 Comment 丛丛丛1: 我感觉自己没有对 为什么要把super init赋值给 self弄懂。 Comment 丛丛丛2: 在考虑写子类时 instancetype会变得更有意义,这到 底是啥意思? 上图是为数组分配空间和初始化的语句。 像这样的初始化方法一般都写成 init的样子。 super关键字代表的是父类,这与 self关键字形成了对比。 一般来讲子类对象的初始化是通过间接调用父类对象的初始化方法实现的, 其形式如下图所示: 如果 super的初始化方法成功,那么 self就不为空,然后才可以继续。if 语 句中的内容主要就是对象的 self成分的空间分配和初始化。 为什么要把super init的返回值赋给 self呢?因为它的返回值是对象的父类 成分的存储位置,这个存储位置可能会变动,为了确保整个对象是一个整体, 就必须要把super init的返回值赋给 self。 这个 instancetype其实是个自适应类型,它的作用是使返回值类型与正在初 始化的对象的类型一致。它可以让编译器根据上下文自动判断出它是哪个类型, 确切地说,它是根据消息的接收者来判断的,而所谓的消息接收者就是像这个 Fraction alloc,它标志着已经为一个 Fraction对象分配空间了。父类的初始化 方法不能显式定义返回对象类型,所以当你想要生成子类时,instancetype 在这 方面会更加有意义,我就想问到底有啥意义,你不要让我猜好不好?! 如果你的类中有多个初始化函数,你最好把它们的公共的部分抽取出来, 单独形成一个方法,这一点和 Effective C+中讲的是一个道理。 初始化方法的返回值类型必须是 instancetype。因为只有这样子类才能用父 类的初始化函数来构造自己的成分。父类的那些成分是自适应类型,所以只有 当确定要生成某个子类的对象的时候,编译器才把这些父类的自适应类型确定 Comment 丛丛丛3: 这是我根据书中的 内容做的推测。 Comment 丛丛丛4: 这是我的猜测 Comment 丛丛丛5: 我真的感觉到莫名 其妙,姑且留个记号。 Comment 丛丛丛6: 我感觉毫无因果关 系。 为这个子类类型。不然的话,父类的成分始终是父类的成分无法变成子类的。 其实这个初始化方法类似于构造函数,所以它也是第一个被调用的方法。 Scope Revisited More on Properties, Synthesized Accessors, and Instance Variables 在名字前面加一个下划线是实例变量命名的惯用法。 如下图所示: 这里面 window是类的属性,_window 是对象的成员变量,这条语句可以 把 window的存取器与_window 关联,即,可以把类的属性的存取器与对象的 成员变量关联起来,我在想这大概就是说 window的存取器也能用来存取 _window。 我在想这里面无论是 window还是_window 都是个变量,变量怎么会调用 方法呢?书中是不是写错了? 方法可能做一些诸如分配内存和复制等工作,不过这些不会在存取对象成 员变量的时候发生,这就让系统在处理属性和对象成员变量之间产生了一层抽 象,这层抽象要完成一些额外的工作。 具体来说就是你即使不写synthesize 编译器也会为你产生存取器。 上图中 isFinishedFlag是类属性,_isFinishedFlag 是对象成员变量,这样一 来你可以不用像下图这样 用存取器来对属性进行设置,直接设置对象成员变量即可,如下图所示: Global Variables 对于全局变量按照习惯是在它的名字前面加上一个小写的 g 以表示 global 之意,如下图所示: 像这样在一个编译单元中的所有方法和类之外定义的全局变量还具有外部 链接属性,即,别的编译单元也能使用此变量。 和 C/C+一样,如果你想在某一编译单元中引用别的编译单元的全局变量 只需要在本编译单元中用 extern 关键字再次声明该变量即可,如下图所示: 在这里没有 extern 关键字的编译单元中全局变量是可以被赋值的,也就是 说在这个编译单元中全局变量是可以被定义的,而其他编译单元只是引用这一 定义而已。 但是从语法上讲你也可以在引用的编译单元中对 extern 来的全局变量赋值, 不过这个很奇怪,因为使用 extern 的地方是声明式不是定义式。 但是总来的来说你只能定义一次也就是赋一次值,如果多次赋值会出现重 复定义的错误。 定义全局变量的编译单元在使用该全局变量时不需要 extern 关键字。 Static Variables 和 C/C+一样就是把变量限制在本编译单元之中。 类的方法是无法访问对象的成员变量的,不过这可以通过增加一个中间层 来解决,而这个中间层就是 static 全局变量。 和interface 一样,implementation 部分也是由implementation 开始 end 结束的。 Enumerated Data Types 这和 C/C+的枚举类型大同小异,首先你要定义一个枚举类型,如下图所 示: 现在 flag 就是一个枚举类型了,你可以用 flag 去声明该类型的变量: 枚举类型的标识符也可以在定义时被赋值为整形数,其实它就是整形值, 这一点与 C/C+相同,无需赘言。 既然枚举类型标识符是整数,你也可以把整数转换成枚举类型,如下图所 示: 你也可以定义一个无名枚举类型,如下图所示: 这里的 direction 不是枚举类型名而是枚举类型的变量。 The typedef Statement 与 C/C+中的语法完全一致,无需多言,如下图所示: 上图中就是把枚举类型命名为 Direction。 Data Type Conversions 这个说的就是强制类型转换,和 C 语言一样加括号标类型。 Conversion Rules 这个是隐式转换规则,简而言之一句话就是向着占用空间大的类型转换过 去。值得注意的是 bool、char、short、int、bitfield 枚举类型会自动转换成 int。 Bit Operators 位操作符还是那些玩意。 位操作符只能用于 int,位操作符也可以这样用: The Bitwise Exclusive-OR Operator 是 XOR 也就是异或操作符,而所谓异或操作符是指不同为 1,相同则为 0。 The Ones Complement Operator 是按位取反操作符,即 1 变成 0,0 变成 1。 &的优先级比|的优先级要高。 The Right-Shift Operator 对于 unsigned 型数向右移位的话高位补 0。 而对于有符号数而言,如果高位是 0,那么右移后高位补 0,否则符号位是 1 的话,右移以后高位可能是 1 也可能是 0,前者被称为算数右移后者是逻辑右 移。 在 Objective-C 中如果你移动的位数大于等于这个数的类型本身具有的位数 的话,得出的结果将是未定义的。与此相似,如果你移动的位数是个负值,得 出的结果也将是未定义的。 Chapter 11 Categories and Protocols Categories 这个 categories 是 Objective-C 特有的语法,它是对已有类声明的扩展,其 作用是将类中相关的方法模块化,就是将类中的方法划分成若干个类别,每个 类别有个名目。 上图就是 Fraction 类中的一个类别 MathOps,由于它是对原类的扩展,所 以必须引进原来的类声明,即#import “Fraction.h” 。 正因为引进了原来的类声明,编译器知道原来的类长成啥样子,所以此处 不用写该类的父类。 你可以把 categories 中方法的定义与原来的类方法的定义写在同一个 implementation 里面,你也可以分开写。后者你必须如下图这样写: 按照惯例用“类名+类别名.h”和“类名+ 类别名.m”来命名单独的 categories 头文件和源文件,也就是类别的方法定义单独写在一个文件里的那种 形式。例如,MathOps 类别所在的头文件就可以写成 “Fraction+MathOps.h”, 源文件可以写成“Fraction+MathOps.m” 。 一般来讲如果把类别和原类放在一起,万一原类不允许被更动,那么类别 也休想被更动,因为它们在同一个文件里面。如果你不想这样的话还是把它们 分开写的好。 Class Extensions 类别也可以是无名的,这种无名的类别叫做类扩展。 类扩展允许你通过增加实例变量和属性来扩展类,这是有名类别做不到的。 类扩展中方法的定义是在类的implementation 中定义的而不是单独的。 类扩展中的方法是私有的,说白了就是相当于 C+中的 private 段,这个不 同于带有减号的方法,因为那些是给对象用的,而这一段所说的是类本身要用 到的。 这些方法之所以是私有的是因为它们没有在类的interface 中声明,但是 如果客户要是知道某个方法的话同样可以使用,所以这个私有与 C+中的私有 相比起来封装性不好。 如果你想让某个方法只能通过别的方法访问,即变成私有的,那你可以把 它的声明 写到.m 源码文件中去。 Some Notes about Categories 类别中的方法能覆盖原类中的方法,但是这不是好的编程习惯,因为你再 也不能用原来类的那个方法了。 如果你非要覆盖,最好写个子类。 不要在各类别中定义同一方法,因为编译器不知道哪个是哪个。 类别不仅能影响本类还能影响子类,因为所有子类都会继承类别的方法, 不管那些子类能否用得着,这很危险。 类别可能会破坏你最初使用它们的目的,所以你要确保类别是为你的目的 服务的。 Objective-C 中的 namespace 是被程序代码和所有库共享的,所以 object/category 名称对必须是惟一的。 Protocols and Delegation protocol,协议,一看到这个我就想到计算机网络里的协议了,但是此协议 非彼协议。 Objective-C 中的协议是指可以被类共享的一系列方法。 协议中的方法可以是毫不相关的,这些方法都是与某个名称相关联的。 协议中方法有些你必须实现,有些你可以选择实现。如果你实现了协议中 所有必须被实现的方法,那这叫做与协议一致,或者接受协议。Objective-C 允 许你定义一个协议,这个协议里的方法要么都是可选的,要么都是必须要实现 的。 定义一个协议的语法如下所示: 首先是要使用protocol 指令,后接该 protocol 的名字,里面的方法声明与 interface 中的一样,end 结束此 protocol。 接受协议意味着你要实现协议中所有必须被实现的方法,其语法如下: 在上图中 AddressBook 是你自己的类,NSCopying 是你要接受的协议,你 需要把它用尖括号括起来,跟在父类和本类后边。 当你接受多个协议的时候可以这样写: 一旦一个类接受了协议,它的子类也就自然而然地接受了协议,无论它需 不需要。 父类接受的协议可以在子类中实现。 协议中可选的方法是用optional 表示出来的,如下图所示: 当然你也可以用required 命令把协议中那些必须被实现的方法标识出来。 如果你不实现这些方法,编译器也不会报错顶多是警告。 协议是一个与类无关的概念,任何类都可以去接受协议,所以有的时候你 需要判断某对象是否接受了某协议,你可以使用 conformsToProtocol:方法判断, 如下图所示: 在这里 currentObject 消息的接收者protocol (Drawing)是消息的内容,从语 法层面来讲,前者是调用方。 检查协议中某方法是否被实现的写法如下所示: selector 返回某方法的唯一标识,也可以理解为 id,这有点像函数指针的 意思。 你可以让编译器帮你检查某对象是否接受了某协议,如下图所示: 如果是静态类型的话,该对象没有接受该协议编译器就会发出警告。 如果是动态类型的话,编译器是不会发出警告的,因为它也不知道该对象 到底有没有接受该协议,不过我想在运行期可能会发出一些警告或错误。 协议也是可以接受协议的,如下图所示: Drawing3D 协议就接受了 Drawing 协议。 category 也可以接受协议,如下图所示: 如果你不想让别人知道你的类接受了某个 protocol,那你可以让你的无名 category,也就是类扩展,去接受这个协议,如下图所示: 和类名一样,protocol 名也必须是惟一的。 感觉 protocol 有点像 java 里面的 interface。 Delegation delegation委托。 delegation 的思想是你知道你要做什么事情,但是这件事情你不想自己去做, 你的关注点在于功能的组织上,至于具体的实现就交给相应的类去处理吧。这 也是面向接口编程思想的反应,protocol 就是一种 delegation。 Informal Protocols informal protocol 其实是一个 category,因为每个类都是从根类,即,最上 层的类继承而来的,所以 informal protocol 其实是为根类定义的。 有时候 informal protocol 也被称为 abstract protocol。 它其实没有什么语法上的作用,只不过这样做看起来比较工整有利于模块 化组织。 声明 abstract protocol 的类并不实现它的方法,实现该 abstract protocol 的子 类需要在他自己的interface 中再次声明这些方法,并在implementation 中去 实现 abstract protocol 中的方法。编译器不对 informal protocol 提供任何帮助。 接受 informal protocol 的对象可以不实现所有方法,编译器对它的一致性检 查只在运行时进行。但是 formal protocol 的一致性检查无论是在编译期还是运 行期都是必须的。 optional 指令的目的是想代替 informal protocol。 Composite Objects 这是一种设计思想而不是语言特性,关于这一点 Effective C+里面讲过。 chapter 12 The Preprocessor The #define Statement 宏的写法有两种惯例: 1、全大写。 2、加一个前缀 k,此后每个单词的首字母大写。 如果一个完整的字符串一行放不下,你可以在第一行后面加个然后把剩下 的放在第二行,这样这两行又是一个完整的字符串了。 宏的英文单词是 macros。 The #import Statement #import 就相当于#include,一样一样的, “”这个先从用户头文件找起, 从系统头文件找起。 这是 Objective-C 中被称为 modules 的用法,它可以让系统的头文件更快速 地被预编译而且能避免命名空间的冲突。 Conditional Compilation Objective-C 有个 #elif 的宏,我想应该是 else if 的组合。 Objective-C 允许你通过设置编译选项来仅仅设置宏名,如下图所示: #ifdef 等于#if defined (),如下图所示: 它还可以有计算: 条件编译也可以被用来当做注释使用。 The #undef Statement Objective-C 提供 #undef 来注销一个宏,就是原先一个宏被定义了,遇到它 以后这个宏就没了。 Chapter 13 Underlying C Language Features Arrays 这个跟 C 语言是一样的,例如下面这个: 这个实际上是声明了一个指针数组,不过在这里 Objective-C 直接把它成为 Fraction 对象数组。 Initializing Array Elements 如果是对数字型数组进行部分初始化,那么剩余部分会被自动初始化为 0。 Objective-C 允许你这样赋值: 在中用中括号 +下标的形式来引用本数组元素,然后直接对它们赋值,顺 序任意。数组的容量决定于最大的下标,是最大下标+1。 Character Arrays 未标明元素个数的数组会根据实际元素个数自动确定数组大小。 Objective-C 字符串也是以0 结尾的。 Functions 这是个函数: 这是个方法: 可以看出函数的类型是不用括起来的,而方法的不然。 反正总体来说 Objective-C 中的函数跟 C 语言中的函数是一样一样的。 Comment 丛丛丛7: 这个是什么东西?Arguments and Local Variables 如果使用 ARC(Automatic Reference Counting)的话,未被显式初始化的本地 变量会被默认初始化为 0。 Returning Function Results 如果函数返回值类型被省略了,则默认为 int。 如果方法没写返回值类型,那么系统默认为它是 id类型。 Declaring Return Types and Argument Types 函数在默认情况下具有外部连接属性。 如果你想把某函数限定在编译单元之内你就应该使用 static关键字在其声 明前面。 static函数的用法与 C+中的相同。 Functions, Methods, and Arrays 函数接受数组为参数的写法与 C语言的一样,也是需要数组名和数组长度。 由于函数接受的是数组的地址,所以函数改动的是数组本身。 Blocks 块的形式类似于函数,但是它们是两回事。 块可以定义在函数和方法之中。 块可以访问在块之外的任何变量,但是这个访问操作是只读,除非你使用 _block。 块可以作为参数被传递给函数和方法。 块的优点之一是可以被系统发送给其他的处理过程或线程去执行。 表示这个东西是一个块,它没有名称,后面跟的是形参列表。 你可以把一个块赋给一个变量,它的声明方式类似于给函数指针赋值,如 下图所示: 你要对这个变量做些修饰,比如返回值和参数都是 void,用 表示它是一个 块等。 执行块的方式和执行函数的方式是一样的,如下图所示: 当你想在 block 内改变某变量的值时,可以在该变量的定义式前面加上_ block,如下图所示: Structures Initializing Structures 结构体初始化的形式如下: 部分初始化结构体的形式如下所示: 像这种部分初始化的结构体,第一项被初始化为 7,而其余项是未定义的。 你也可以在 内对指定项赋值,如下图所示: 同样,第二张图的其余项也是未定义的。 Additional Details about Structures 在结构体定义时声明结构体变量: 你也可以在这个时候对结构体变量初始化: 和 C/C+一样,你也可以定义无名结构体变量: Pointers and Structures 声明一个结构体指针的方法如下所示: Pointers and Arrays 针对于对象类型的数组的指针声明形式如下: 注意这里面有两个星号。 毫无疑问第一个星号代表它是一个它是一个指针,那么第二个星号代表什 么呢? 因为一般的对象声明方式是 Fraction *fractsPtr,所以我想第二个星号仅仅 代表它是一个对象,这两个星号合起来就是对象指针的意思。 该指针使用的形式如下: 这就是函数指针的解引用形式。 Pointers to Character Strings Objective-C 在使用函数的时候还要声明下?这一点不同于 C 语言,在 C 语 言当中如果函数定义在 main 上面就可以直接使用,不用这么费劲。 原来 Objective-C 的函数在这种情况下也不用声明,如下图所示: 但是作者为啥还要在 main 中写声明呢,难道是顺手写的? Constant Character Strings and Pointers 像”hello world” 这样的是字符串对象而不是字符串。 你可以把一个常量字符串赋给一个 char*指针,但是你不能用常量字符串对 char 数组赋值,除非是初始化。 解引用操作符*和自加自减操作符具有相同的优先级都是按从右到左的顺序 参与计算的。 Pointers to Functions 取函数地址的时候你可以在函数名前加一个&,但是这不是必须的。 Theyre Not Objects! 在 Objective-C 中对象是可以接收消息的,你可以通过判断某东西是否能接 收消息来判定它是不是对象。 Miscellaneous Language Features Compound Literals 这是 Objective-C 中独有的语法,把一个无名类型放进一对括号中间后面跟 一个初始化列表,这个无名类型是任意的。 比如: 上一个是无名结构体,下一个是无名数组。 你可以把它赋给同类型变量,也可以当作实参传递给函数和方法。 How Things Work Fact 1: Instance Variables Are Stored in Structures 实例对象其实都存储在结构体中。 这个结构体中有叫 isa 的成员,它用来标识对象各成分所属的类。 public 指令可以使某成员具有 public 访问属性。 Fact 2: An Object Variable Is Really a Pointer Objective-C 中声明对象的方式其实是声明一个指针,其实这我早就知道了。 这只是单纯地指针之间的赋值,它俩指向同一个结构体。 Fact 3: Methods Are Functions, and Message Expressions Are Function Calls 方法的本质就是函数。 方法就是在函数名前面添加一个类名修饰而来的。 Fact 4: The id Type Is

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论