一、oc介绍
1、简介
oc是一个成熟的,面向对象的语言
oc是基于c之上的,扩展的c
oc是从Smalltalk【1】得到对象的方法及语法。所有的非面向对象的操作(包括原始变量,预处理,表达式,函数声明和函数调用)的语法和c语言相同,而面向对象的特性的语法是Smalltalk的消息机制。
2、调试器
调试时编程的最有创造性和治理挑战的方面之一,他也是最费力的方面之一。由于调试是一个困难但却关键的任务,所以重要的是要学习调试的技巧。这些技巧中最重要的是让计算机向您展示它在做什么,这是debugging的关键。
NSLog打印函数:
例:NSLog(@"The current date and time is:%@",[NSDate date]);
例:
(1) int intValue = -100; NSInteger intValue2 = -999;
NSLog(@"int:%d,%d",intValue,intValue2);//int -100 -999
注:NSInteger is int type, not class!是基本数据类型的typedef,不是类。平台不同,NSIntger对于的类型也不同。跨平台,可移植性
(2)unsigned int uintValue = 100; unsigned int uintValue2 = -100;
NSLog(@"unsigned int : %u %u",uintValue,uintValue2);//unsigned int:100 4294967196
(3)char aChar = 'G'; char bChar = 0x61; unichar aUnichar = Ox4f60;//unichar,两个字节
NSLog(@"char:%c %c,unichar:%C",aChar,bChar,aUnichar);//char:G a, unichar:你);
(4)const unichar pUnichar[] = {L'你',L'好',0x0000};
NSLog(@"C string(unichar):%S",pUnichar);//
【1】Smalltalk和许多程序设计语言不同,它不仅仅是一门语言。它是一种面向对象的程序设计语言;一种程序设计环境;一个应用开发环境(ADE)
3、C的扩展
在Objective-C中只要看到@符号,都可以把它看成是C语言的扩展
Foundation框架处理的是用户界面之下的层中的特性,例如数据结构和通信机制。 Foundation框架的头文件占用了近1MB的磁盘存储空间,包含一万四千多行代码,涵盖一百多个文件。使用#import<Foundation/Foundation.h>包含主头文件,就能够获得整个集合。也许你认为辛苦地读取每个文件的全部文本会耗去编译器很多时间,但是Xcode非常聪明:他会使用预编译头文件(一种经过压缩的、摘要形式的头文件),在通过#import导入这种文件时,加载速度会非常快。
Cocoa对其所有函数、常量和类型名称都添加了‘NS’前缀。这个前缀告诉你函数来自Cocoa而不是其他工具包。【NS前缀->NeXTSoftware】。
3.1布尔类型
Object-C的BOOL类型比C语言的bool类型早诞生十多年。这两种布尔类型可以在同一个程 序中共存,但在编写Cocoa代码时要使用BOOL。(说明:oc中的BOOL实际上是一种对带符号的字符类型的定义,它使用8位存储空间。YES定义为1,而NO定义为0。oc并不将BOOL作为仅能保存YES或NO值的真正的布尔类型来处理。编译器奖BOOL认做8位二进制数,YES和NO值只是一种约定。这引发一个小问题:如果不小心将一个长于1字节的整型值(例如short或int值)赋给一个BOOL变量,那么只有低位数字节会用作BOOL值。假设该地位字节刚好为0【例如8960,写成十六进制为0x2300】,BOOL值将会是0,即NO值。
二、面向对象编程基础知识(OOP面向对象编程-Object-Oriented Programming)
1、类
oc定义了一个根类:NSObject,每一个新的类,应该是一个NSObject类的子类。它提供了一个系统运行时的大量方法。也就是说,每一个对象的类型都是NSObject,每一个指针指向对象的指针都可以被声明为NSObject*。事实上,我们可以使用id这个类型来代替。这就是一个生命对象或指针的简单方法,并且支持动态类型检查来代替静态类型检查。
(1) 方法声明:
mType (returnType) name1:(type1)param1 name2:(type2)param2...
方法需要参数时,方法名后要有冒号;冒号前面是标签,冒号后面是参数类型和参数名
+类方法(C++静态成员函数),用类名调用;
-实例方法(C++非静态成员函数),用对象名调用
static int sum = 5;//静态全局变量
注:OC不支持静态成员变量,通过静态全局变量来实现静态成员变量功能
(2)类的实现
2、
@interface部分,它用于定义类的公共接口。
@implemention部分,使对象真正起作用的代码位于@implementation部分中
注:Objective-C中不存在真正的私有方法,也无法把某个方法标示为私有方法,从而禁止其他代码调用它。这是Objective-C动态本质的副作用。
实例化对象时,需要分配内存,然后这些内存被初始化并保存一些有用的默认值,这些值不同于你在获得新分配的内存时得到的随机值。内存分配和初始化完成后,就创建了一个新的对象实例。
三、继承
说明:不要直接更改由继承得到的实例变量的值。一定要使用方法来更改他们。
某些语言(例如C++)具有多继承特性,在这种情况下,一个类可以直接冲两个或多个类继承而来。但Objective-C不支持多继承,如果你尝试在Objective-C中使用多继承(多继承的形式可能类似于以下语句),编译器将不能识别他们:@interface Circle:NSObject,PrintableObject;你可以通过OC的其他特性获取多继承的优点,例如分类和协议。
因为继承在子类和超类之间建立了一种"is a"(是一个)关系,所以NSObject的实例变量称为isa。使用更具体种类的对象代替一般类型,这种能力称为多态性。
每个方法调用都获得了一个名为self的隐藏参数,它是一个指向接收消息的对象的指针。方法实用self参数查找它们要使用的实例变量。
OC提供某种方式来重写方法,并且仍然调用超类的实现方式。当需要超类实现自身的功能,同时在前面货后面执行某些额外的工作时,这种机制非常有用。为了调用继承方法的实现,需要使用super作为方法调用的目标。
super既不是参数也不是实例变量,而是由OC编译器提供的某种神奇功能。向super发送消息时,实际上是在请求OC向该类的超类发消息。如果超类中没有定义该消息,OC将按照通常的方式在继承链中继续查找对应的消息。
四、复合
1、什么是复合
编程中的复合就好像音乐中的作曲一样:将多个组件组合在一起配合使用,从而得到完整的作品。创作乐曲时,作曲人可能会选择低音管声部组成交响乐的二声部。在OC中,复合是通过包含作为实例变量的对象指针实现的。严格地讲,只有对象间的组合才能叫复合。
2、存取方法
存取方法是用来读取或改变对象特定属性的方法。存取方法:setter方法,getter方法
说明:get这个词在Cocoa中有着特殊的含义。如果get出现在cocoa的方法名称中,就意味着这个方法会通过你当做参数传入的指针来返回数值。例如,NSData(cocoa中的类,创建可存储任意字节序列的对象)中又一个getBytes:方法,它的参数就是用来存储字节的内存缓冲区的地址。
复合建立的是“has a”的(有一个)关系。
五、源文件组织
@class创建了一个前向引用。就是在告诉编译器:“相信我,以后你会知道这个类到底是什么,但是现在,你只需要知道这些。”如果有循环依赖关系,@class也很有用。即A类使用B类,B类也使用A类。如果试图通过#import语句让这两个类互相引用,那么最后就会出现编译错误。但是如果在A.h中使用@class B,在B.h中使用@class A,那么这两个类就可以相互引用了。
如果它们是继承自其他类而不是通过指针指向其他类,则不能在头文件中使用@class语句。