1、Objective-C 定义:
OC是以SmallTalk为基础,建立在C语言之上,是C语言的超集。
2、使用:
2007年苹果公司发布了OC 2.0,并在iPhone上使用OC进行开发。
3、编译环境:
Xcode
4、框架:
OC编程中主要用到的框架是Cocoa,它是MacOS X中五大API之一,它由两个不同的框架组成FoundationKit 和ApplicationKit。
5、优点:
类别、扮演(Posing)、动态类型、指针计算、弹性信息传递、不是一个过度复杂的c衍生语言、可通过Objective-c++与c++结合。
6、缺点:
没有命名空间、没有操作符重载、不像c++那样复杂;
7、文件:
包括头文件源文件;
.h头文件:头文件包涵类的定义、类型、方法以及常量的声明。.m源文件:这个典型的扩展名用来定义源文件,可以同时包含C和Objective-C的代码。
注:如果要加入c++的语法,需要用到.mm。
8、引用:
#import Foundation.h注:每个框架有一个主的头文件,只要包含了这个文件,框架中的所有特性都可以被使用。
9、@:
@符号是OC在C基础上新加的特性之一。9.1:代码中@"aaaaaaaa":表示引用的字符串应该作为Cocoa的NSString元素来处理。
9.2:@interface,@implement等则是对于C的扩展,是OC面向对象特性的体现。
10、NSLog()与printf():
NSLog()提供了一些特性,如时间戳,日期戳和自动加换行符等;printf() 则是C的语法什么也没有;
11、关于NS,UI:
前缀函数来自Cocoa而不是其他工具包。12、BOOL与bool:
OC中的BOOL:YES(1),NO(0)C中的bool:true(!0),false(0)
13、id:
OC新加的一个数据类型,它是一般的对象类型,能够存储任何类型的方法。
14、nil与NULL
两者是等价的,OC中的nil 的定义: #define nil NULL15、类:
在OC中定义一个类需要有两个部分:接口和实现。类的定义从@interface开始到@end结束。
接口文件包含了类的声明,定义了实例变量和方法。
实现文件包含了具体的函数的实现代码。
16、方法:
一个方法定义包含了方法类型,返回类型,一个或者多个关键词,参数类型和参数名。在OC中,调用一个方法相当于传递一个消息,这里的消息指的是方法名和参数。
在OC中一个类中的方法有两种类型:实例方法,类方法。
实例方法前用(-)号表明,类方法用(+)表明;
- (void)setName:(NSString *)name setAge:(NSInteger)age;
消息调用的方式是使用方括号;
[[Person alloc] init];
消息传递允许嵌套;
17、属性:
通过property标识符来替代getter和setter方法;
使用方法:在类接口文件中用@property标识符,后面跟着变量的属性,
包括 copy, retain, assign ,readonly,readwrite,nonatomic,然后是变量名。
同时在实现文件中用@synthesize标识符来取代getter和setter方法。
属性的另一个好处就是,可以使用点(.)语法来访问,点语法均是调用了getter和setter方法;
assign:简单赋值,不更改索引计数,
使用assign: 对基础数据类型 (NSInteger)和C数据类型(int, float, double, char,等)
retain,是说明该属性在赋值的时候,先release之前的值,然后再赋新值给属性,引用再加1。
copy:指定应该使用对象的副本(深度复制),前一个值发送一条release消息,
没有增加引用计数,是分配一块新的内存来放置它。
copy是创建一个索引计数为1的对象,然后释放旧对象,retain是创建一个指针,引用对象计数加1。
readonly:将只生成getter方法而不生成setter方法(getter方法没有get前缀)。
readwrite:默认属性,将生成不带额外参数的getter和setter方法(setter方法只有一个参数)。
atomic:对于对象的默认属性,就是setter/getter生成的方法是一个原子操作。
如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter的情况,
相关于方法头尾加了锁一样。
nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。
先释放原先变量,再将新变量retain然后赋值;
注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。
18、继承:
冒号后的标识符是需要继承的类。
注:OC不支持多继承,要注意的是OC只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现;
注:OC中任何一个类都是继承NSObject;与Java中任何类都继承Object一样
19、super:
OC提供重写方法,并且仍然调用超类的实现方式。
当需要超类实现自身的功能,同时在前面或后面执行某些额外的工作时,为了调用继承方法的实现,需要使用super作为方法调用的目标。
向super发送消息时,实际上是在请求OC向该类的超类发送消息。
注:如果超类中没在定义该消息,OC将按照通常的方式在继承链中继续查找对应的消息。
20、对象初始化:
两种方法:
1、[类名new]
2、[[类名 alloc]init]。这两种方法是等价的,但是少有用到第一种;
NSString *name=[[NSString alloc]init];
[[类名alloc]init]有两个动作:alloc是分配动作,是从操作系统获得一块内存并将其指定为存放对象的实例变量的位置,
同时,alloc方法还将这块内存区域全部初始化为0。与分配动作对应的是初始化init;
21、init方法:
在alloc 分配内存后,可以手写init初始化方法;相当于Java中的构造函数;可以重写由父类继承的init方法,也可以添加自己的init 参数方法;
注:重写父类的init方法时可以使用:
self= [super init];
22、协议 @protocol:
协议即java 中的接口:
1、申明:
@protocol ADelegate
- (void)methodA;
- (void)methodB;
@end
2、使用:
@interface ClassB <ADelegate> {
}
@end
注:@optional和@required;可选的实现方法,和必须的实现方法;
23、委托delegate:
编写委托对象并将其提供给其他一些对象,通过实现特定的方法,可以控制Cocoa中的对象的行为。
适合于回调机制:即A调用B时,设置B的delegate为A,A调用B的方法时既可以在B中回调A的方法;
24、类别:
类别允许你在现有的类中加入新功能,这些类可以是框架中的类,并且不需要扩充它。
申明与实现:
@interface NSString (NumberConvenience)
-(NSNumber *)lengthAsNumber;
@end
@implementation NSString (NumberConvenience)
-(NSNumber*) lengthAsNumber
{
unsigned intlength = [self length];
return ([NSNumber numberWithUnsignedInt: length]);
}
@end
用于拓展系统类的功能;上例中就是用于拓展NSString的功能;
注:
类别无法向类中添加新的实例变量,类别没有位置容纳实例变量。
命名时注意命名冲突,当有冲突时类别具有更高的优先级。
25、选择器@selector():
选择器只是一个方法名称,它以OC运行时使用的特殊方式编码,以快速执行查询。
@selector(btnClick:)
选择器十分灵活:可以被传递,可以作为方法的参数使用,甚至可以作为实例变量存储。
26、Posing :“冒充”:
Posing存在的目的在于子类可以冒充父类,使得后续的代码无需把父类修改为子类,
就可以很方便的让父类表现成子类的行为,从而实现非常方便的冒充;
<span style="font-size:14px;">[FunctionChild poseAsClass [Function class]]; </span>
此时FunctionChild 便可以冒充Function 在Function的对象实例中使用的是 FunctionChild 的方法;
27、动态识别:
-(BOOL)isKindOfClass:classObj
//是否是其子孙或一员
-(BOOL)isMemberOfClass:classObj
//是否是其一员
-(BOOL)respondsToSelector:selector
//是否有这种方法
+(BOOL)instancesRespondToSelector:selector
//类的对象是否有这种方法
-(id)performSelector:selector
//执行对象的方法