首页 > 代码库 > Objective-C高级第一卷

Objective-C高级第一卷

Objective-C高级第一卷

一、历史篇·二之一

(1)1958年5月,苏黎世举行第一次设计会议,为新语言定下目标。其先被命名为国际代数语言(International Algebraic  Language,IAL) ,转辗后定为ALGOL,即算法语言。是在计算机发展史上首批清晰定义的高级语言

ALGOL发展:ALGOL 58、ALGOL 60、ALGOL W(1966年)、ALGOL 68

(2)1963年英国剑桥大学推出了CPL(Combined Programming Langurage)语言

(3)1967年英国剑桥大学的 Matin Richards对CPL做了简化,推出了 BCPL (Base Combined Programming Langurage)语言

(4)1969年前后,美国贝尔实验室的肯·汤普森(Ken Thompson)和丹尼斯·利奇(Dennis Ritchie)设计出B语言,并用B语言写出了第一个 UNIX 操作系统

(5)1972年至1973年间,贝尔实验室的 D.M.Ritchie 在 B 语言的基础上设计出了 C 语言,C语言即保持 BCPL 语言和 B 语言的优点(精练、接近硬件),又克服了他们的缺点(过于简单,数据无类型等)

C发展:C89、C99、C11(2011年)

(6)在1971年到1975年之间,Kay在Xerox PARC的小组设计并实现了第一个真正的Smalltalk语言系统,Smalltalk被公认为历史上第二个面向对象的程序设计语言和第一个真正的集成开发环境 (IDE)

(7)80年代初布莱德·考克斯(Brad Cox)在其公司Stepstone发明Objective-C,它是C与SmallTalk-80的结晶,兼二者之长。

(8)1983年,贝尔实验室的Bjarne Stroustrup在C语言基础上推出了C++

(9)C#是微软公司在2000年6月发布的一种新的编程语言,主要由安德斯·海尔斯伯格(Anders Hejlsberg)主持开发,它是第一个面向组件的编程语言

(10)Swift是苹果于2014年WWDC(苹果开发者大会)发布的新语言

二、历史篇·二之二

(1)1985年,被赶出苹果的乔布斯成立了NeXT公司,选择Unix作为其操作系统,并创建了NeXTSTEP Toolkit软件包,此包用于开发用户界面,功能强大,其编程语言就是Objective-C。

(2)1988年,Next公司获得了Objective-C的抚养权,并使他在NEXTSTEP的优越环境下生长,而NEXTSTEP是从BSD Unix系统演变而来。事实上,Objective-C贵不忘本,其以后的很多方法,都以NS开头命名(OC没有命名空间和包类,故通过前缀来区别各类、枚举、结构体)。

注:定义枚举、结构体变量不需要加星号。

附1.1结构体的基本操作

1)定义结构体struct Data{//定义一个名为Data 的struct类型    int year;    int month;    int day;}data;//这个data是变量,可以直接在后面赋值,也可如下面(2)方式赋值2)声明结构体变量struct Date data = http://www.mamicode.com/{2016, 1, 6};(3)调用结构体NSLog(@"data: %d/%d/%d", data.year, data.month, data.day);注:ARC新规定:你不能在C结构中使用OC对象,更好的方法是用OC类去管理对象。

附1.2结构体和类区别

1)结构体只能封装数据,而类还可以封装行为(2)结构体变量分配在栈空间(如果是是1个局部变量的情况下),而对象分配在堆空间。        栈的特点:空间相对较小,但是存储在栈中得数据访问的效率稍高一些        堆的特点:空间的相对较大,但是存储在堆中的数据,效率低一些        存储在栈中得数据访问效率高, 存储在堆中得数据效率低(3)赋值        结构体是(拷贝)        对象之间是(地址)

附2.1C风格的枚举

//位移操作枚举enum {      UIViewAutoresizingNone                 = 0,      UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,      UIViewAutoresizingFlexibleWidth        = 1 << 1,      UIViewAutoresizingFlexibleRightMargin  = 1 << 2,      UIViewAutoresizingFlexibleTopMargin    = 1 << 3,      UIViewAutoresizingFlexibleHeight       = 1 << 4,      UIViewAutoresizingFlexibleBottomMargin = 1 << 5  };  typedef NSUInteger UIViewAutoresizing;//使用NSUInteger的地方可以使用UIViewAutoresizing,//UIViewAutoresizing相当于NSUInteger的一个别名使用。  //因此一个UIViewAutoresizing的变量可以直接赋值给NSUInteger  

附2.2Objective-C风格的两种枚举

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {    UIViewAnimationTransitionNone,    UIViewAnimationTransitionFlipFromLeft,    UIViewAnimationTransitionFlipFromRight,    UIViewAnimationTransitionCurlUp,    UIViewAnimationTransitionCurlDown,};typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {    UIViewAutoresizingNone                 = 0,    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,    UIViewAutoresizingFlexibleWidth        = 1 << 1,    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,    UIViewAutoresizingFlexibleHeight       = 1 << 4,    UIViewAutoresizingFlexibleBottomMargin = 1 << 5};注:NS_ENUM这种声明出来的东西大部分是单选. NS_OPTIONS声明出来的大部分是多选.

附2.3带名称的枚举标准定义

typedef enum {    //以下是枚举成员     TestA = 0,     TestB,      TestC,  }Test;//枚举名称亦可以如下定义(推荐:结构比较清晰): typedef NS_ENUM(NSInteger, Test1) {    //以下是枚举成员    Test1A = 0,     Test1B = 1,     Test1C = 2, };

(4)成长起来的Objective-C出类拔萃,甚至在1992年,GNU开发环境都对Objective-C敞开怀抱。

(5)1994年,NeXT和Sun公司联合发布了OPENSTEP,对NEXTSTEP进行了改进,其中两重要部分是Foundation和Application Kit,并于此时开始使用NS前缀。

(6)1995年,NeXT从Stepstone处得到了Objective-C的所有权。

(7)1996年,苹果公司收购NeXT,故OPENSTEP/NEXTSETP环境成了苹果操作系统下一个主要发行版本OS X的基础。这个开发环境的版本被苹果公司成为Cocoa。Cocoa内置了对Objective-C的支持,并结合了Project Builder(或他的后继版本Xcode)和Interface Builder等开发工具。

(8)2007年,Objective-C成长到2.0版本。

三、框架篇

(1)框架、框架集:框架是一种把头文件、库、图片、声音等内容聚集在一个独立单元中的集合体。一个框架集包含多个框架。

(2)框架集:Cocoa、Carbon、QuickTime、OpenGL、Cocoa Touch等。

(3)头文件:框架包含很多头文件,其中有个主头文件,在主头文件中,导入(#import)了该框架的所有其他头文件,故在程序中导入(#import)主头文件,就可访问该框架所有内容。

Foundation框架的主头文件为“Foundation.h”,其导入时体现为:#import<Foundation/Foundation.h>

(4)改善速度:也许你担心头文件太大时导入文件过多而影响编译速度,不过Xcode会使用预编译头文件来大大改善此种情况。

(5)Cocoa与Cocoa Touch区别之分

Cocoa包含Foundation、Core Data和AppKit框架,可用于开发Mac OS X系统的应用程序。Cocoa Touch包含Foundation、Core Data和UIKit框架,可用于开发iPhone OS系统的应用程序。Cocoa是 Mac OS X 的开发环境,Cocoa Touch是 iPhone OS的开发环境。

(6)常用工具包

1)“Foundation工具包”:或简称为“Foundation”,首先出现在OpenStep中。在Mac OS X中,它是基于Core Foundation的。作为通用的面向对象的函数库,Foundation提供了字符串,数值的管理,容器及其枚举,分布式计算,事件循环,以及一些其它的与图形用户界面没有直接关系的功能。

2)“应用程序工具包”:或称AppKit(Application Kit)是直接衍生自NeXTSTEP的AppKit的。它包含了程序与图形用户界面交互所需的代码。它是基于Foundation建立的,也使用“NS”前缀。它只能在Mac OS X中使用。

3)用户界面工具包”:或称UIKit(User Interface Kit),是用于iOS的图形用户界面工具包。它使用“UI”的前缀。

(7)其他工具包

除 UIKit 之外,Cocoa Touch 包含创建世界一流 iOS 应用程序所需的所有框架,从 3D 图形、专业音频到网络,甚至提供特殊设备访问 API 以控制摄像机或从 GPS 硬件获取位置。

Core Animation(支持型框架):通过 Core Animation,您就可以通过基于组合独立图层的简单编程模型来创建丰富的用户体验。
Core Audio(支持型框架):Core Audio 是播放、处理和录制音频的专业级技术,能够轻松为您的应用程序添加强大的音频功能。
Core Data(支持型框架):Core Data 提供面向对象的数据管理解决方案,该方案易于使用和理解,甚至可处理任何应用或大或小的数据模型。

(8)用过系统的哪些框架

UIKit:UI控件Foundation:基础框架 NSObject、NSString、NSArray等音视频:Core Audio、OpenAL、Media Library、AV Foundation数据管理:Core Data、SQLite图形和动画:Core Animation、OpenGL ES、Quartz 2D、Core Graphics用户应用:AddressBook、CoreLocation、 MapKit、Store Kit其他:MobileCoreService、SystemConfiguration、libz.dylib、libxml2

(9)用过哪些第三方框架

Reachability 检测网络连接ASIHTTPRequest 网络请求AFNetworking 网络请求MBProgressHUD 提示效果SVProgressHUD 提示效果ZAActivityBar 提示效果SDWebImage 图片异步加载及缓存UIActivityIndicator-for-SDWebImage 为SDWebImage显示加载效果UIImage+Resize 调整图片大小ImageCacheResize 异步加载图片、缓存及调整大小EGOTableViewPullRefresh  下拉刷新PullToRefresh 下拉刷新STableViewController  下拉刷新、上拉加载更多SVPullToRefresh 下拉刷新、上拉加载更多CMPopTipView 提示信息PTShowcaseViewController媒体库效果ios-image-filters.图片滤镜效果PDF Reader Core for iOS PDF阅读器核心Three20  iPhone UI类集,以及HTTP磁盘缓存等通用工具Nimbus 比起Three20更全面、丰富facebook-ios-sdk 让开发者将Facebook相关功能集成到自己App中RestKit 网络通信GPUImage 基于GPU图像和视频处理的开源iOS框架MonoGame Microsoft XNA 4.x Framework的开源跨平台实现cheddar-ios 简单即时的任务管理器ViewDeck 类似于Path 2.0 的视图左右滑动的效果GMGridView 开源的iOS(iPhone/iPad)表格视图QuickDialog 可以帮助开发者快速创建复杂的表单Appirater 用于提醒用户在打开App时,对应用进行评论或打分Reader 让iOS开发者轻而易举地在iOS设备屏幕上显示PDF文件CocoaAsyncSocket 提供了Mac OS X及iOS异步套接库SSToolkit 用于解决iOS开发者在开发过程中常碰到的一些问题XMPPFramework 提供一个RFC-3920核心实现,通过工具读写XMLMGSplitViewController 用于iPad左右分栏界面显示CocoaLumberjack 日志框架PSTCollectionView UICollectionView的开源API兼容替代品CocoaHTTPServer 应用的轻量级、可嵌入的HTTP服务器框架PushSharp 推送消息通知的开源C#服务器端库HockeyKit 用于iOS和Android下App更新的开发包JTRevealSidebarDemo Facebook客户端和Path应用的视图切换PKRevealController 类似于Facebook客户端的视图横向切换效果QuincyKit 提供的程序崩溃报告管理解决方案PSStackedView 能够将你的UIViewControllers堆叠起来Chameleon 可直接替代UIKit在Mac OS X上运行的框架DCIntrospect 很小的iOS工具集,帮助开发者对UIKit用户界面调试PSCollectionView 实现Pinterest风格瀑布流效果的iOS滚动组件SDURLCache 处理缓存FastPdfKit 能让你在应用中显示PDF文档的开发类库KKGridView 一个高性能的iOS表格组件MGBox2 能够实现非常酷的列表交互效果MKNetWorkKit 一个完全基于 ARC 的网络工具包

四、差异篇

(1)与C差异

导入区别——#include与#import。后者保证头文件只被包含一次,无论此命令在该文件中出现多少次,C中要实现这功能,通常使用基于#ifdef的方案。输出区别——printf("");与NSLog(@"");  。后者附加了时间日期戳、进程线程号和自动换行符等。NSString区别——""@""  后者是Cocoa中NSString类型的字符串。布尔区别——bool(true与false)与BOOL(YES与NO)。二者可在同一程序中共存,但BOOL比bool早诞生十多年,且编写Cocoa代码时,只能用BOOL。注释区别——有文档注释,第三方完成文档注释的方法为用github的onevcat/vvDocumenter。下载下来,运行一次,然后全退,重新进入,版本匹配即可使用【Xcode8似乎不可用】。函数/方法调用方式不同注意1:若将C风格的字符串传入NSLog,会引发警告。注意2:import””和import<>区别是文件搜索顺序,前者为从当前文件夹下------编译器文件夹下-------系统文件夹下------查找失败;后者是从编译器文件夹下-------系统文件夹下------查找失败。

(2)比C新增

新增关键字:@interface@implementation@end@public@protected@private、@selector 、@try@catch@throw@finally@protocol、@optional、@required、@class、@property、@synthesize、@dynamic、BOOL Class SEL YES NO id self  super nil atomic nonatomic retain assign copy block …新增数据类型:BOOL(字面常量值是YES或则NO)、NSObject *    (OC中的对象类型)、id/in(动态对象类型,万能指针)、SEL(选择器数据类型)、block(代码块数据类型)新增流程控制:for in循环

(3)与Java比:异常处理几乎用不到

(4)与C++比:

OC不支持多继承、但有类别C++ 跟从面向对象编程里的Simula 67(一种早期OO语言)学派,而Objecive-C属于Smalltalk学派Objective-C是动态定型(dynamicaly typed),它的类库比C++容易操作

五、零碎篇

(1).h、.m和.mm文件

(2)->和打点的区别:Zhangsan->_name相当于(*zhangsan)._name

(3)预编译指令#pragma mark指令

#pragma mark 描述:加入描述#pragma mark -:加入横线

(4)前缀的由来和设置的注意事项

(5)Xcode中如何设置一切警告为错误

(6)如何开启僵尸调试

 

Objective-C高级第一卷