- 浏览: 316174 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
u011076522:
写的确实不错,总结的很好,内容大都属实
C/C++内存分配方式 -
水晶魔方:
...
联合编译工具推荐IncrediBuild -
caiwb1990:
又看了一遍~ 越看越清晰~
C/C++内存分配方式 -
caiwb1990:
每次准备面试的时候来瞅瞅。timer_yin 写道好文,正好补 ...
TCP/IP、Http、Socket的区别【转】 -
caiwb1990:
互相学习~kongxuan 写道这个不错,用简单的话将事情讲明 ...
TCP/IP、Http、Socket的区别【转】
学了段时间的IOS了, 把过去的学习笔记整理下把.
iOS 系统架构
Cocoa Touch
Media
Core Services
Core OS
Objective-C简介
本来自己整理了一些,然后看到有一篇写的超好,就搞过来了。原帖也找不到了,如果侵犯了原作者,请联系我。
首先Objective-C是C的一个超集。
其次Objective-C是一个面向对象的语言。
#import = #include
在头文件定义的都是公共的(方法 or 变量)
在m文件里面定义的都是私有的(方法 or 变量)
@property 这个后面的变量在声明的时候就一起声明了两个方法(getter setter)
第一节 总括
这一节是对Objective-C(以后简称ObjC)的简要介绍,目的是使读者对ObjC有一个概括的认识。
ObjC简介:ObjC是以SmallTalk为基础,建立在C语言之上,是C语言的超集。20世纪80年代早期由 Brad J.Cox设计,2007年苹果公司发布了ObjC 2.0,并在iPhone上使用ObjC进行开发。
ObjC学习内容:习的内容主要包括语法和Cocoa框架两部分。本文主要对语法进行介绍。
IDE:编写ObjC程序最主要的编译环境是Xcode,它是苹果官方提供的IDE,官网中的SDK包括Xcode,可以通过下载SDK来获得它。但是Xcode只支持MacOS X,所以如果要在其它环境下编写ObjC程序,要使用其它IDE。Linux/FreeBSD用GNUStep,Windows NT5.x(2000,XP)要先安装cywin或mingw,然后安装GNUStep。同时仅仅通过文本编辑器,GCC的make工具也可以用于开发。 注:如果要使用到Cocoa的话,只能在Apple公司的Xcode上。
框架: ObjC编程中主要用到的框架是Cocoa,它是MacOS X中五大API之一,它由两个不同的框架组成FoundationKit 和ApplicationKit。 Foundation框架拥有100多个类,其中有很多有用的、面向数据的低级类和数据类型,如NSString,NSArray, NSEnumerator和NSNumber。ApplicationKit包含了所有的用户接口对象和高级类。这些框架本文不做重点介绍,如果要深入了解可以去看Xcode自带的文档。
特别之处:初次接触ObjC时,会发现许多和其它语言不同的地方,会看到很多的+,-,[ ,] ,@, NS等符号,这些符号在以后的编程中将经常看到,这部分内容在第二节中介绍。先熟悉一下ObjC的代码
除了这些语言要素上的不同,ObjC也提供了一些很好的特性,如类别,扮演(Posing)等,这些在运行时的特性使得编程更加灵活。
优缺点: 每一个语言都有其优缺点,ObjC也不例外,这就要求在选择语言时权衡利弊。对于ObjC,只要善于利用它的优点,你会发现它是一个简单,灵活,高效的语言。以下列举了它的一些特点:
优点: 类别、扮演(Posing)、动态类型、指针计算、弹性信息传递、不是一个过度复杂的c衍生语言、可通过Objective-c++与c++结合
缺点: 没有命名空间、没有操作符重载、不像c++那样复杂
第二节对C的扩展
1.扩展名
ObjC是ANSI版本C的一个超集,它支持相同的C语言基本语法。与C一样,文件分为头文件和源文件,扩展名分别为.h和.m。如果要加入c++的语法,需要用到.mm,这里不做介绍。
2.#import
在ObjC里,包含头文件有比#include更好的方法#import。它的使用和#include相同,并且可以保证你的程序只包含相同的头文件一次。相当于#include+ #pragma once的组合。 例如要包含Foundation框架中的Foundation.h文件,可以像下面这样。
3.@符号
@符号是ObjC在C基础上新加的特性之一。常见到的形式有@”字符串”,%@ , @interface,@implement等。@”字符串”表示引用的字符串应该作为Cocoa的NSString元素来处理。@interface等则是对于C的扩展,是ObjC面向对象特性的体现。 注:这里提一个小技巧,只要看到@符号,就可以认为它是对于C的一个扩展。
4.NSLog()
在ObjC中用的打印函数是NSLog(),因为ObjC是加了一点”特殊语料”的C语言,所以也可以用printf()但是NSLog()提供了一些特性,如时间戳,日期戳和自动加换行符等,用起来更方便,所以推荐使用NSLog()。下面是两种输出的对比。
使用NSLog()输出任意对象的值时,都会使用%@格式说明。在使用这个说明符时,对象通过一个名为description的方法提供自己的NSLog()格式。
5.BOOL
BOOL是ObjC中的布尔类型,它和C中的bool有如下区别
6.id
这是ObjC新加的一个数据类型,它是一般的对象类型,能够存储任何类型的方法。
7.nil
在ObjC中,相对于C中的NULL,用的是nil。这两者是等价的。下面是nil的定义。
#define nil NULL
第三节 创建对象
1.接口和实现
在ObjC中定义一个类需要有两个部分:接口和实现。接口文件包含了类的声明,定义了实例变量和方法。实现文件包含了具体的函数的实现代码。下图显示了一个叫MyClass的类,它继承自NSObject基类。类的定义总是从@interface开始到@end结束。在类名后面的是父类的名称。实例变量被定义在两个花括号之间。在实例变量下面的是方法的定义。一个分号用来结束一个变量或者方法。
下面的代码显示了MyClass这个类的实现代码。就像类的定义规则一样,类实现文件也被两个标识框起来,一个是@implementation,还有一个是@end。这两个指令标识符告诉编译器程序从哪里开始编译到哪里结束。类中的方法名称的定义和它接口文件中的定义是一样的,除了实现文件中有具体的代码以外。
当你要把一个对象保存进变量,要使用指针类型。ObjC同时支持强和弱变量对象。强类型对象在变量类型定义的时候包含了类名。弱对象使用id类型作为实例变量。下面的例子同时显示了定义MyClass中的强弱两种类型的变量
2.方法
一个方法定义包含了方法类型,返回类型,一个或者多个关键词,参数类型和参数名。在ObjC中一个类中的方法有两种类型:实例方法,类方法。实例方法前用(-)号表明,类方法用(+)表明,通过下图可以看到,前面有一个(-)号,说明这是一个实例方法。
在ObjC中,调用一个方法相当于传递一个消息,这里的消息指的是方法名和参数。所有的消息的分派都是动态的,这个体现了ObjC的多态性。消息调用的方式是使用方括号。如下面的例子中,向myArray对象发送insertObject:atIndex:这个消息。
这种消息传递允许嵌套
前面的例子都是把消息传递给实例变量,你也可以把消息传递给类本身。这时要用类方法来替代实例方法 。你可以 把他想象成静态C++类(当然不完全相同)。 类方法的定义只有一个不一样那就是用加号(+)代替减号(-)。下面就是使用一个类方法。
3.属性
属性提供了比方法更方便的访问方式。通过property标识符来替代getter和setter方法。使用方法就是在类接口文件中用@property标识符,后面跟着变量的属性,包括 copy, tetain, assign ,readonly , readwrite,nonatomic,然后是变量名。同时在实现文件中用@synthesize标识符来取代getter和setter方法。
接口文件中使用@property
实现文件中使用@synthesize
属性的另一个好处就是,可以使用点(.)语法来访问,如下所示:
第四节继承
继承的语法如下,冒号后的标识符是需要继承的类。
1.不支持多继承
要注意的是ObjC只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现,这两种方法将在后面进行介绍。
2.Super关键字
ObjC提供某种方式来重写方法,并且仍然调用超类的实现方式。当需要超类实现自身的功能,同时在前面或后面执行某些额外的工作时,这种机制非常有用。为了调用继承方法的实现,需要使用super作为方法调用的目标。下面是代码示例:
Super来自哪里呢?它既不是参数也不是实例变量,而是由ObjC编译器提供的某种神奇功能。向super发送消息时,实际上是在请求ObjC向该类的超类发送消息。如果超类中没在定义该消息,ObjC将按照通常的方式在继承链中继续查找对应的消息。
第五节 对象初始化
1.分配与初始化
对象的初始化有两种方法:一种是[类名new], 第二种是[[类名 alloc]init]。这两种方法是等价的,不过,通常的Cocoa惯例是使用alloc和init,而不使用new.一般情况下,Cocoa程序员只是在他们不具备足够的水平来熟练使用alloc和init方法时,才将new作为辅助方法使用。
[[类名alloc]init]有两个动作。alloc是分配动作,是从操作系统获得一块内存并将其指定为存放对象的实例变量的位置。同时,alloc方法还将这块内存区域全部初始化为0。与分配动作对应的是初始化。有如下两种初始化写法。
应该使用第一种写法,因为init返回的对象可能不是以前的那个。
2.编写初始化方法
下面是一段初始化的代码
使用self= [super init]的作用是使超类完成它们自己的初始化工作。同时因为init可能返回的是不同的对象,实例变量所在的内存位置到隐藏的self参数之间的跳离又是固定的,所以要这样使用。 注:这部分可以参考书[1]144页。
第六节协议
这里的协议是正式协议,相对的还有非正式协议,这在类别一节中有介绍。正式协议是一个命名的方法列表。它要求显式地采用协议。采用协议意味着要实现协议的所有方法。否则,编译器会通过生成警告来提醒你。 1.声明协议
2.采用协议
协议可以采用多个,并且可以按任意顺序列出这些协议,没有什么影响。
3.ObjC 2.0的新特性
ObjC2.0增加了两个新的协议修饰符:@optional和@required,因此你可以像下面这样编写代码:
因此,一个采用BaseballPlayer协议的类有两个要求实现的方法:-drawHugeSalary和-swingBat,还有3个不可选择实现的方法:slideHome,catchBall和throwBall。
第七节委托
Cocoa中的类经常使用一种名为委托(delegate)的技术,委托是一种对象,另一个类的对象会要求委托对象执行它的某些操作。常用的是,编写委托对象并将其提供给其他一些对象,通常是提供给Cocoa生成的对象。通过实现特定的方法,你可以控制Cocoa中的对象的行为。
通过下面的例子,可以更清楚地理解委托的实现原理。其中A对象需要把一些方法委托给其它对象来实现,例子中就是对象B,B实现了含A对象特定方法的协议ADelegate,从而可以在B中实现A委托的方法。
注:实现委托还可以使用类别,在第八节中将做介绍
第八节 类别
类别允许你在现有的类中加入新功能,这些类可以是框架中的类,并且不需要扩充它。
1.声明类别
该声明表示,类别的名称是NumberConvenience,而且该类别将向NSString类中添加方法。
2.实现类别
3.局限性
类别有两方面的局限性。第一,无法向类中添加新的实例变量。类别没有位置容纳实例变量。第二,名称冲突,即类别中的方法与现有的方法重名。当发生名称冲突时,类别具有更高的优先级。这点可以通过增加一个前缀的方法解决。
4.非正式协议和委托类别
实现委托除了第七节中应用协议的方式,还可以使用类别。具体做法就是把委托对象要实现的方法声明为一个NSObject的类别。如下面的代码所示:
通过将这些方法声明为NSObject的类别,使得只要对象实现了委托方法,任何类的对象都可以成为委托对象。创建一个NSObject的类别称为“创建一个非正式协议”。非正式协议只是一种表达方式,它表示“这里有一些你可能想实现的方法”,第六节介绍的协议可以叫做正式协议。
非正式协议的作用类似于使用许多@optional的正式协议,并且前者正逐渐被后者所代替。
5.选择器
选择器只是一个方法名称,它以ObjC运行时使用的特殊方式编码,以快速执行查询。你可以使用@selector()预编译指令指定选择器,其中方法名位于圆括号中。如一个类中setEngine:方法的选择器是:
因为选择器可以被传递,可以作为方法的参数使用,甚至可以作为实例变量存储。这样可以生成一些非常强大和灵活的构造。
第九节Posing
Posing有点像类别,但不太一样。它允许你扩充一个类,并且全面性地扮演(pose)这个超类。例如:你有一个扩充NSArry的NSArrayChild对象。如果你让NSArrayChild扮演NSArry,则在你的代码中所有的NSArray都会自动被替代为NSArrayChild.
这个程序的输出中,第一个fraction会输出3/10,而第二个会输出(3/10),这是FractionB中实现的方式。poseAsClass这个方法是NSObject的一部分,它允许子类扮演超类。
第十节动态识别 (Dynamictypes)
下面是应用动态识别时所用到的方法:
通过下面的代码可以更清楚地理解动态类型的使用:
iOS 系统架构
Multi-Touch Alerts Core Motion Web View View Hierarchy Map Kit Localization Image Picker Controls Camera
Core Audio JPEG PNG TIFF OpenAL PDF Audio Mixing Quartz(2D) Audio Recording Core Animation Video Playback OpenGL ES
Collections Core Location Address Book Net Services networking Threading File Access Preferences SQLite URL Utilities
OSX kernel Power Management Mach 3.0 Keychain Access BSD Certificates Sockets File System Security Bonjou
Objective-C简介
本来自己整理了一些,然后看到有一篇写的超好,就搞过来了。原帖也找不到了,如果侵犯了原作者,请联系我。
引用
首先Objective-C是C的一个超集。
其次Objective-C是一个面向对象的语言。
#import = #include
在头文件定义的都是公共的(方法 or 变量)
在m文件里面定义的都是私有的(方法 or 变量)
@property 这个后面的变量在声明的时候就一起声明了两个方法(getter setter)
第一节 总括
这一节是对Objective-C(以后简称ObjC)的简要介绍,目的是使读者对ObjC有一个概括的认识。
ObjC简介:ObjC是以SmallTalk为基础,建立在C语言之上,是C语言的超集。20世纪80年代早期由 Brad J.Cox设计,2007年苹果公司发布了ObjC 2.0,并在iPhone上使用ObjC进行开发。
ObjC学习内容:习的内容主要包括语法和Cocoa框架两部分。本文主要对语法进行介绍。
IDE:编写ObjC程序最主要的编译环境是Xcode,它是苹果官方提供的IDE,官网中的SDK包括Xcode,可以通过下载SDK来获得它。但是Xcode只支持MacOS X,所以如果要在其它环境下编写ObjC程序,要使用其它IDE。Linux/FreeBSD用GNUStep,Windows NT5.x(2000,XP)要先安装cywin或mingw,然后安装GNUStep。同时仅仅通过文本编辑器,GCC的make工具也可以用于开发。 注:如果要使用到Cocoa的话,只能在Apple公司的Xcode上。
框架: ObjC编程中主要用到的框架是Cocoa,它是MacOS X中五大API之一,它由两个不同的框架组成FoundationKit 和ApplicationKit。 Foundation框架拥有100多个类,其中有很多有用的、面向数据的低级类和数据类型,如NSString,NSArray, NSEnumerator和NSNumber。ApplicationKit包含了所有的用户接口对象和高级类。这些框架本文不做重点介绍,如果要深入了解可以去看Xcode自带的文档。
特别之处:初次接触ObjC时,会发现许多和其它语言不同的地方,会看到很多的+,-,[ ,] ,@, NS等符号,这些符号在以后的编程中将经常看到,这部分内容在第二节中介绍。先熟悉一下ObjC的代码
#import "ClassA.h" #import <stdio.h> int main( int argc, const char *argv[] ) { ClassA *c1 = [[ClassA alloc] init]; ClassA *c2 = [[ClassA alloc] init]; //print count printf("ClassA count: %i\n", [ClassA initCount] ); ClassA *c3 = [[ClassA alloc] init]; //print count again printf("ClassA count: %i\n", [ClassA initCount] ); [c1 release]; [c2 release]; [c3 release]; return 0; }
除了这些语言要素上的不同,ObjC也提供了一些很好的特性,如类别,扮演(Posing)等,这些在运行时的特性使得编程更加灵活。
优缺点: 每一个语言都有其优缺点,ObjC也不例外,这就要求在选择语言时权衡利弊。对于ObjC,只要善于利用它的优点,你会发现它是一个简单,灵活,高效的语言。以下列举了它的一些特点:
优点: 类别、扮演(Posing)、动态类型、指针计算、弹性信息传递、不是一个过度复杂的c衍生语言、可通过Objective-c++与c++结合
缺点: 没有命名空间、没有操作符重载、不像c++那样复杂
第二节对C的扩展
1.扩展名
ObjC是ANSI版本C的一个超集,它支持相同的C语言基本语法。与C一样,文件分为头文件和源文件,扩展名分别为.h和.m。如果要加入c++的语法,需要用到.mm,这里不做介绍。
引用
.h 头文件。头文件包涵类的定义、类型、方法以及常量的声明
.m 源文件。这个典型的扩展名用来定义源文件,可以同时包含C和Objective-C的代码。
.m 源文件。这个典型的扩展名用来定义源文件,可以同时包含C和Objective-C的代码。
2.#import
在ObjC里,包含头文件有比#include更好的方法#import。它的使用和#include相同,并且可以保证你的程序只包含相同的头文件一次。相当于#include+ #pragma once的组合。 例如要包含Foundation框架中的Foundation.h文件,可以像下面这样。
c #import<Foundation/Foundation.h>
3.@符号
@符号是ObjC在C基础上新加的特性之一。常见到的形式有@”字符串”,%@ , @interface,@implement等。@”字符串”表示引用的字符串应该作为Cocoa的NSString元素来处理。@interface等则是对于C的扩展,是ObjC面向对象特性的体现。 注:这里提一个小技巧,只要看到@符号,就可以认为它是对于C的一个扩展。
4.NSLog()
在ObjC中用的打印函数是NSLog(),因为ObjC是加了一点”特殊语料”的C语言,所以也可以用printf()但是NSLog()提供了一些特性,如时间戳,日期戳和自动加换行符等,用起来更方便,所以推荐使用NSLog()。下面是两种输出的对比。
使用NSLog()输出任意对象的值时,都会使用%@格式说明。在使用这个说明符时,对象通过一个名为description的方法提供自己的NSLog()格式。
5.BOOL
BOOL是ObjC中的布尔类型,它和C中的bool有如下区别
BOOL YES(1),NO(0) bool true(!0),false(0)
6.id
这是ObjC新加的一个数据类型,它是一般的对象类型,能够存储任何类型的方法。
7.nil
在ObjC中,相对于C中的NULL,用的是nil。这两者是等价的。下面是nil的定义。
#define nil NULL
第三节 创建对象
1.接口和实现
在ObjC中定义一个类需要有两个部分:接口和实现。接口文件包含了类的声明,定义了实例变量和方法。实现文件包含了具体的函数的实现代码。下图显示了一个叫MyClass的类,它继承自NSObject基类。类的定义总是从@interface开始到@end结束。在类名后面的是父类的名称。实例变量被定义在两个花括号之间。在实例变量下面的是方法的定义。一个分号用来结束一个变量或者方法。
下面的代码显示了MyClass这个类的实现代码。就像类的定义规则一样,类实现文件也被两个标识框起来,一个是@implementation,还有一个是@end。这两个指令标识符告诉编译器程序从哪里开始编译到哪里结束。类中的方法名称的定义和它接口文件中的定义是一样的,除了实现文件中有具体的代码以外。
@implementation MyClass -(id)initWithString:(NSString *) aName { if (self = [super init]) { count count = 0; data = nil; name = [aName copy]; return self; } } +(MyClass *)createMyClassWithString: (NSString *) aName { return [[[self alloc] initWithString:aName] autorelease]; } @end
当你要把一个对象保存进变量,要使用指针类型。ObjC同时支持强和弱变量对象。强类型对象在变量类型定义的时候包含了类名。弱对象使用id类型作为实例变量。下面的例子同时显示了定义MyClass中的强弱两种类型的变量
MyClass* myObject1; // Strong typing id myObject2; // Weak typing
2.方法
一个方法定义包含了方法类型,返回类型,一个或者多个关键词,参数类型和参数名。在ObjC中一个类中的方法有两种类型:实例方法,类方法。实例方法前用(-)号表明,类方法用(+)表明,通过下图可以看到,前面有一个(-)号,说明这是一个实例方法。
在ObjC中,调用一个方法相当于传递一个消息,这里的消息指的是方法名和参数。所有的消息的分派都是动态的,这个体现了ObjC的多态性。消息调用的方式是使用方括号。如下面的例子中,向myArray对象发送insertObject:atIndex:这个消息。
myArray insertObject:anObj atIndex:0];
这种消息传递允许嵌套
[[myAppObject getArray] insertObject:[myAppObject getObjectToInsert] atIndex:0];
前面的例子都是把消息传递给实例变量,你也可以把消息传递给类本身。这时要用类方法来替代实例方法 。你可以 把他想象成静态C++类(当然不完全相同)。 类方法的定义只有一个不一样那就是用加号(+)代替减号(-)。下面就是使用一个类方法。
NSMutableArray* myArray = nil; // nil is essentially the same as NULL // Create a new array and assign it to the myArray variable. myArray = [NSMutableArray arrayWithCapacity:0];
3.属性
属性提供了比方法更方便的访问方式。通过property标识符来替代getter和setter方法。使用方法就是在类接口文件中用@property标识符,后面跟着变量的属性,包括 copy, tetain, assign ,readonly , readwrite,nonatomic,然后是变量名。同时在实现文件中用@synthesize标识符来取代getter和setter方法。
@property BOOL flag; @property (copy) NSString* nameObject; // Copy the object during assignment. @property (readonly) UIView* rootView; // Create only a getter method
接口文件中使用@property
@synthesize flag,nameObject,rootView;
实现文件中使用@synthesize
属性的另一个好处就是,可以使用点(.)语法来访问,如下所示:
myObject.flag = YES; CGRect viewFrame = myObject.rootView.frame;
第四节继承
继承的语法如下,冒号后的标识符是需要继承的类。
@interface Circle : NSObject
1.不支持多继承
要注意的是ObjC只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现,这两种方法将在后面进行介绍。
2.Super关键字
ObjC提供某种方式来重写方法,并且仍然调用超类的实现方式。当需要超类实现自身的功能,同时在前面或后面执行某些额外的工作时,这种机制非常有用。为了调用继承方法的实现,需要使用super作为方法调用的目标。下面是代码示例:
@implementation Circle -(void)setFillColor: (ShapeColor) c { if(c== kRedColor){ c = kGreenColor; } [super setFillColor: c]; } @end
Super来自哪里呢?它既不是参数也不是实例变量,而是由ObjC编译器提供的某种神奇功能。向super发送消息时,实际上是在请求ObjC向该类的超类发送消息。如果超类中没在定义该消息,ObjC将按照通常的方式在继承链中继续查找对应的消息。
第五节 对象初始化
1.分配与初始化
对象的初始化有两种方法:一种是[类名new], 第二种是[[类名 alloc]init]。这两种方法是等价的,不过,通常的Cocoa惯例是使用alloc和init,而不使用new.一般情况下,Cocoa程序员只是在他们不具备足够的水平来熟练使用alloc和init方法时,才将new作为辅助方法使用。
[[类名alloc]init]有两个动作。alloc是分配动作,是从操作系统获得一块内存并将其指定为存放对象的实例变量的位置。同时,alloc方法还将这块内存区域全部初始化为0。与分配动作对应的是初始化。有如下两种初始化写法。
Car *car = [[Class alloc] init]; //写法1 Car *car = [Car alloc]; [car init]; //写法2
应该使用第一种写法,因为init返回的对象可能不是以前的那个。
2.编写初始化方法
下面是一段初始化的代码
-(id)init { if(self = [super init]){ engine = [Engine new]; … } }
使用self= [super init]的作用是使超类完成它们自己的初始化工作。同时因为init可能返回的是不同的对象,实例变量所在的内存位置到隐藏的self参数之间的跳离又是固定的,所以要这样使用。 注:这部分可以参考书[1]144页。
第六节协议
这里的协议是正式协议,相对的还有非正式协议,这在类别一节中有介绍。正式协议是一个命名的方法列表。它要求显式地采用协议。采用协议意味着要实现协议的所有方法。否则,编译器会通过生成警告来提醒你。 1.声明协议
@protocol NSCopying -(id) copyWithZone:(NSZone *)zone; @end
2.采用协议
@interface Car : NSObject <NSCopying , NSCoding> { // instance variables } @end
协议可以采用多个,并且可以按任意顺序列出这些协议,没有什么影响。
3.ObjC 2.0的新特性
ObjC2.0增加了两个新的协议修饰符:@optional和@required,因此你可以像下面这样编写代码:
@protocol BaseballPlayer -(void)drawHugeSalary; @optional -(void)slideHome; -(void)catchBall; @required -(void)swingBat; @end
因此,一个采用BaseballPlayer协议的类有两个要求实现的方法:-drawHugeSalary和-swingBat,还有3个不可选择实现的方法:slideHome,catchBall和throwBall。
第七节委托
Cocoa中的类经常使用一种名为委托(delegate)的技术,委托是一种对象,另一个类的对象会要求委托对象执行它的某些操作。常用的是,编写委托对象并将其提供给其他一些对象,通常是提供给Cocoa生成的对象。通过实现特定的方法,你可以控制Cocoa中的对象的行为。
通过下面的例子,可以更清楚地理解委托的实现原理。其中A对象需要把一些方法委托给其它对象来实现,例子中就是对象B,B实现了含A对象特定方法的协议ADelegate,从而可以在B中实现A委托的方法。
@protocol ADelegate <NSObject> - (void)aDelegateMethod; …… @end @interface A : NSObject { …… id <ADelegate> delegate; } @property (readwrite, assign) id<ADelegate> delegate; …… @end @implementation A @synthesize delegate; - (void)aMethod { [delegate aDelegateMethod]; ...... } @end //A类 @interface B : NSObject <ADelegate> @end @implementation B - (id)init { [[A sharedA] setDelegate:self]; } - (void)aDelegateMethod{ //B中实现A委托的方法 } @end //B类
注:实现委托还可以使用类别,在第八节中将做介绍
第八节 类别
类别允许你在现有的类中加入新功能,这些类可以是框架中的类,并且不需要扩充它。
1.声明类别
@interface NSString (NumberConvenience) -(NSNumber *) lengthAsNumber; @end
该声明表示,类别的名称是NumberConvenience,而且该类别将向NSString类中添加方法。
2.实现类别
@implementation NSString (NumberConvenience) -(NSNumber *) lengthAsNumber { unsigned int length = [self length]; return ([NSNumber numberWithUnsignedInt: length]); } @end
3.局限性
类别有两方面的局限性。第一,无法向类中添加新的实例变量。类别没有位置容纳实例变量。第二,名称冲突,即类别中的方法与现有的方法重名。当发生名称冲突时,类别具有更高的优先级。这点可以通过增加一个前缀的方法解决。
4.非正式协议和委托类别
实现委托除了第七节中应用协议的方式,还可以使用类别。具体做法就是把委托对象要实现的方法声明为一个NSObject的类别。如下面的代码所示:
@interface NSObject(NSSomeDelegateMethods) -(void)someMethod; … @end
通过将这些方法声明为NSObject的类别,使得只要对象实现了委托方法,任何类的对象都可以成为委托对象。创建一个NSObject的类别称为“创建一个非正式协议”。非正式协议只是一种表达方式,它表示“这里有一些你可能想实现的方法”,第六节介绍的协议可以叫做正式协议。
非正式协议的作用类似于使用许多@optional的正式协议,并且前者正逐渐被后者所代替。
5.选择器
选择器只是一个方法名称,它以ObjC运行时使用的特殊方式编码,以快速执行查询。你可以使用@selector()预编译指令指定选择器,其中方法名位于圆括号中。如一个类中setEngine:方法的选择器是:
@selector(setEngine:)
因为选择器可以被传递,可以作为方法的参数使用,甚至可以作为实例变量存储。这样可以生成一些非常强大和灵活的构造。
第九节Posing
Posing有点像类别,但不太一样。它允许你扩充一个类,并且全面性地扮演(pose)这个超类。例如:你有一个扩充NSArry的NSArrayChild对象。如果你让NSArrayChild扮演NSArry,则在你的代码中所有的NSArray都会自动被替代为NSArrayChild.
@interface FractionB: Fraction -(void) print; @end @implementation FractionB -(void) print { printf("(%i/%i)", numerator, denominator ); } @end //Fraction.m
int main( int argc, const char *argv[] ) { Fraction *frac = [[Fraction alloc] initWithNumerator: 3 denominator: 10]; //print it printf("The fraction is: " ); [frac print]; printf("\n" ); //make FractionB pose as Fraction [FractionB poseAsClass: [Fraction class]]; Fraction *frac2 = [[Fraction alloc] initWithNumerator: 3 denominator: 10]; // print it printf("The fraction is: " ); [frac2 print]; printf( "\n" ); //free memory [frac release]; [frac2 release]; return 0; } // Main.m
输出 The fraction is: 3/10 The fraction is: (3/10)
这个程序的输出中,第一个fraction会输出3/10,而第二个会输出(3/10),这是FractionB中实现的方式。poseAsClass这个方法是NSObject的一部分,它允许子类扮演超类。
第十节动态识别 (Dynamictypes)
下面是应用动态识别时所用到的方法:
-(BOOL)isKindOfClass: classObj //是否是其子孙或一员 -(BOOL)isMemberOfClass: classObj // 是否是其一员 -(BOOL)respondsToSelector: selector // 是否有这种方法 +(BOOL)instancesRespondToSelector: selector // 类的对象是否有这种方法 -(id)performSelector: selector // 执行对象的方法
通过下面的代码可以更清楚地理解动态类型的使用:
#import "Square.h" #import "Rectangle.h" #import <stdio.h> int main( int argc, const char *argv[] ) { Rectangle *rec = [[Rectangle alloc] initWithWidth: 10 height: 20]; Square *sq = [[Square alloc] initWithSize: 15]; // isMemberOfClass // true if( [sq isMemberOfClass: [Square class]] == YES ) { printf( "square is a member of square class\n" ); } // false if ( [sq isMemberOfClass: [Rectangle class]] == YES ) { printf( "square is a member of rectangle class\n" ); } // false if( [sq isMemberOfClass: [NSObject class]] == YES ) { printf("square is a member of object class\n" ); } // isKindOfClass // true if ( [sq isKindOfClass: [Square class]] == YES ) { printf("square is a kind of square class\n" ); } // true if( [sq isKindOfClass: [Rectangle class]] == YES ) { printf("square is a kind of rectangle class\n" ); } // true if( [sq isKindOfClass: [NSObject class]] == YES ) { printf("square is a kind of object class\n" ); } // respondsToSelector // true if( [sq respondsToSelector: @selector( setSize: )] == YES ) { printf("square responds to setSize: method\n" ); } // false if( [sq respondsToSelector: @selector( nonExistant )] == YES ) { printf("square responds to nonExistant method\n" ); } // true if( [Square respondsToSelector: @selector( alloc )] == YES ) { printf("square class responds to alloc method\n" ); } // instancesRespondToSelector // false if( [Rectangle instancesRespondToSelector: @selector( setSize: )] == YES ) { printf("rectangle instance responds to setSize: method\n" ); } // true if( [Square instancesRespondToSelector: @selector( setSize: )] == YES ) { printf("square instance responds to setSize: method\n" ); } // free memory [rec release]; [sq release]; return 0; }
输出: square is a member of square class square is a kind of square class square is a kind of rectangle class square is a kind of object class square responds to setSize: method square class responds to alloc method square instance responds to setSize: method
发表评论
-
Xcode6.2网盘下载地址
2015-03-15 09:14 2267Xcode6.2.dmg 网盘下载地址 http://p ... -
Mac OS bash基本命令失效后的修复
2014-10-30 17:08 3423升级系统后添加设备发现命令都失效了~ 比如: -bash: l ... -
Android设备在Mac上不能识别
2014-10-30 16:57 17503问题 本来Mac上做Android调试非常简单,实际上大部分 ... -
关于升级IOS8
2014-09-19 11:50 667升级IOS8差不多需要6G的空余空间。我觉得大部分人 ... -
XCode快捷键
2014-06-03 16:23 8601. 文件 CMD + N: 新文件 CMD + SHIF ... -
springboard无法启动应用程序 (错误:-3)
2014-03-05 08:04 1428自从升了Xcode5在ios7模拟器上调试的时候,经常会出 ... -
ios 检查网络
2013-11-08 15:39 850// 检测网络 if (([[Reachability ... -
ios- strong 和 weak的形象理解
2013-11-08 15:10 1322在网上看到了一个很形 ... -
IOS开发-常用代码块
2013-11-08 15:07 11231. 调用 //1、调用 自带mail [[UI ... -
如果还有不用ARC的,请告诉下原因
2013-06-21 14:21 1021今天又看到有人在群里问有人用ARC吗? 呵呵,我是找不到不 ... -
必须推荐款 IOS APP
2013-06-06 11:24 1098Musyc By Fingerlab 非常有创意的一款音乐游 ... -
IOS开发-常见Exception
2013-11-08 15:01 630NSInvalidArgumentException: 未知选 ... -
发个sublime Text手册~~
2013-06-05 20:31 993台湾的,所有是繁体,不过挺不错哦 http://docs.s ... -
ios开发-类的"生命周期
2013-06-04 22:55 1232光有新学IOS的朋友问我 ... -
Xcode快捷键大全
2013-05-31 23:15 936... -
Mac快捷键大全
2013-05-31 23:10 2055全局 Cmd-C 复制文件 Cm ...
相关推荐
这份"iOS史上最全的OC笔记"无疑是学习OC语言的重要参考资料。以下是对笔记内容的详细解读: 1. **基础概念**:OC是C语言的超集,它引入了消息传递机制和动态类型,使得代码更具灵活性。笔记会详细解释类、对象、...
以下是对标题和描述中提及的iOS学习笔记的关键知识点的详细解释: 1. **类的声明和实现**: - OC中的类由`.h`和`.m`两个文件组成,`.h`文件负责声明属性和方法,`.m`文件实现这些声明。 2. **继承与Foundation...
本文将深入探讨从标题和描述中提及的iOS学习笔记,特别是关于OC面向对象编程的一些关键概念和实践。 面向对象编程(OOP)是OC的核心,它强调通过封装、继承和多态来组织代码。在OC中,类(Class)是对象的蓝图,...
【标题】:“无限互联_IOS视频教程_OC教程_课件、源码”这一资源包主要针对的是iOS应用开发的学习,特别是Objective-C(OC)语言的教学。它包含了一系列的视频教程和配套的源码,旨在帮助初学者或者有经验的开发者...
以上内容仅为OC学习笔记合集中的部分知识点概述,深入学习将涵盖更多主题,如Delegation、Design Patterns、网络编程、动画效果、Core Animation等。通过不断实践和探索,你将能够熟练掌握Objective-C,并能构建出...
Swift作为苹果公司推出的新型编程语言,具有语法简洁、类型安全等优点,但同时,由于历史原因,Objective-C在iOS开发领域仍占有很大比重。因此,理解如何在同一个项目中混合使用这两种语言是非常重要的。 在Swift中...
描述:"大神原创的iOS开发教程,内容全面,覆盖OC及iOS开发全部技术细节内容,值得认真学习" 标签:"iOS 移动开发 Objective-C iOS开发 教程" 部分内容: 1. iOS开发基础介绍:开发者拥有丰富的Android、iOS、PHP和...
总的来说,“Objective-C学习笔记”应该覆盖了从基础语法到实际应用的全方位教程,适合初学者系统学习Objective-C,并通过实践加深理解。通过深入学习,开发者可以掌握开发苹果平台应用程序所需的关键技能。
### iOS开发教程(大神原创笔记)核心知识点详解 #### 一、Unix相关知识点 ...通过以上知识点的学习,开发者能够更好地理解和掌握Objective-C的基本语法和面向对象编程的概念,为后续的iOS应用开发打下坚实的基础。
通过解压并打开这些文件,学习者能够跟随教程逐步学习,从基础的OC语法到复杂的iOS框架应用,一步步构建自己的iPhone应用。 在学习过程中,首先需要熟悉Xcode IDE,它是苹果官方推荐的iOS开发工具。然后,通过阅读...
在深入学习时,还需要了解如何使用UIKit创建视图、控制器、事件处理等,以及更高级的主题,如内存管理策略ARC(Automatic Reference Counting)、GCD(Grand Central Dispatch)并行处理、Block语法等。
1. **Objective-C基础**:学习者需要了解OC的基本语法,如类的定义、对象的创建、消息传递机制等。 2. **移动端App开发**:掌握iOS或macOS平台的开发环境,如Xcode的使用,理解App的生命周期,以及如何进行界面布局...
### Objective-C基础教程第二版:OC入门基础教程 ...通过上述知识点的学习,读者可以全面了解Objective-C的基础知识及其在iOS开发中的应用。随着实践经验的积累,将进一步掌握Objective-C的高级特性和最佳实践。
在学习Objective-C的同时,了解Cocoa Touch框架和UIKit非常重要,它们提供了大量用于构建iOS应用的类和工具。例如,`UIViewController`是所有视图控制器的基类,`UIView`负责显示界面元素,`UILabel`、`UIButton`等...
【Objective-C 知识点详解】 Objective-C,简称OC,是苹果公司开发的面向对象的编程语言,它是C语言的超集,具有...Styf的学习笔记可能涵盖这些知识点的详细解释和示例,对于深入理解Objective-C编程大有裨益。