Objective-C的基础语法总结
1.NSLog(@“hello world!”);//打印语句的函数,需要打印的字符串放在@之后。
NSLog(@“are %d and %d different?%@”,4,4,@”YES”);
2.方括号有两个作用:
1)访问数组元素
2)用于通知某个对象执行什么,在方括号内第一项是对象,其余部分是需要对象执行的操作。例如,[shape draw]的含义为通知shape执行draw方法。
3.方法调用:类名 方法名:参数
注意:如果方法使用参数,则需要冒号;否则不需要冒号。
4.类的编写:
头文件中:@interface name
….//声明方法
@end
实现中:@implementation name 注意:此行没有逗号
….//代码实现,其顺序可以不与头文件声明的顺序一致;
.....//另外,也可以定义那些头文件中未声明的方法,可以把它们当做私有方法,仅在类的 .....//实现中使用
@end
5.OC的方法实现时要注意调用的先后顺序:
例如A方法中需要调用B方法,则B方法需要在A方法之前实现。
6.实例化对象
7.C++具有多继承特性,但Objective-C不支持多继承,继承是指两个类之间的关系,避免出现很多重复代码。
8.OC继承知识:
当子类中重写父类方法并调用此方法时,会完全忽略父类中该方法的实现,为了避免忽略父类方法,可以通过super关键字,此时调用子类的重写方法时仍然会调用父类的实现方法。
9.复合是通过包含作为实力变量的对象指针实现的,严格来讲,只有对象间的组合才称为复合。
10.@class创建一个前向引用,就是在告诉编译器:“相信我,以后你会知道这个类到底是什么,但是现在,你只需要知道这些”。
如果有循环依赖关系,@class也很有用。即A类使用B类,B类也使用A类。如果试图通过#import语句将这两个类互相引用,那么最后就会出现编译错误。但是如果在A.h中使用@class B,在B.h中使用@class A,那么这两个类就可以互相引用了。
11.集合框架NSArray有两个限制(NSArray是不可变对象的数组):
(1)只能存储Objective-C的对象,不能存储C语言中的基本数据类型,如int,float,struct,enum等。(2)不能再NSArray中存储nil。
** 创建NSArray对象:arrayWithObjects:…,....,...,....nil;发送一个以逗号分隔的对象列表,在列表结尾添加nil代表列表结束。例如,NSArray * array;
array = [NSArray arrayWithObjects:@“one”,@“two”,@“three”,nil];
** 获取指定索引的对象方法objectAtIndex:
** 将字符串切分为NSArray对象的方法componentsSeparatedByString:();
12.可变数组NSMutableArray,可以随意的添加和删除元素,但数组本身一直是不变的。
** 创建可变数组对象NSMutableArray arrayWithCapacity:3;
** 调用-(void)addObject:(id)anObject;在数组末尾添加对象。
** 调用-(void)removeObjectAtIndex:(unsigned)index;//删除指定索引处的对象。当删除相对靠前索引处的元素时后面的数组元素都被前移来填补空缺。
** 遍历数组时还可以通过NSEnumerator实现,具体代码如下:
//通过NSEnumerator遍历数组
NSEnumerator* enumerator;
enumerator = [tArray objectEnumerator];
id thingid;
while (thingid = [enumerator nextObject]) {
NSLog(@"I found %@",thingid);
}
**快速枚举:
//快速枚举
for(NSString * tmp in tArray){
NSLog(@"I found %@",tmp);
}
13.集合框架NSDictionary:(121页)
类似Java中的map,使用的是键查询的优化存储方式,跟NSString,NSArray一样是不可变的对象。
14.NSArray和NSDictionary只能存储对象,不能存储基本类型数据,因此OC中提供了NSNumber类用来包装基本类型数据(即以对象形式实现)。
+(NSNumber*) numberWithChar:(char)value;
+(NSNumber*) numberWithInt:(int)value;
+(NSNumber*) numberWithFloat:(float)value;
+(NSNumber*) numberWithBool:(BOOL)value;
通常将一个基本类型的数据包装成对象叫做装箱,从对象中提出基本类型的数据叫做取消装箱。OC不支持自动装箱。
15.NSSortDescriptor对象进行数组排序
===========内存管理规则:如果使用new,alloc,或copy方法获得一个对象,则该对象的保留计数器的值为1,而且要负责释放它========================================
16.简化接口
@property预编译指令的作用是自动声明属性的setter和getter方法。
例如:以往我们的一对方法如下所示:
@interface car{
float engine;
}
-(void)setEngine;//设置方法
-(id)engine;//获取对象方法
@end
现在可以用更具有特性的写法实现,具体如下:
@interface car{
float engine;
}
@property float engine;//代替了上面的setEngine和engine方法,用在头文件中
@end
17.简化实现
@synthesize engine;//是一种新的编译器功能,表示“创建该属性的访问器”,当遇到代码@synthesize engine;时,编译器将输出setEngine和engine方法的已编译的代码。
***@ property特性只支持上面提到的那种方式,不支持那些需要接收额外参数的方法。
18.只读性:@property特新默认是可读写的,但是比如驾驶证号码或身份证号码这类特性,我们不希望任何人更改它,我们可以使用@property的只读属性。例如:
@property (readonly) float shoeSize;
编译器将只为该属性生成一个getter方法而不生成setter方法。
19.类别是一种为现有的类(例如类库等)添加新方法的方式。类别还提供了将对象的实现分散到多个不同的源文件、甚至多个不同的框架中的方法。
** 类别的声明格式与类的声明格式类似:
@interface NSString (NumberConvenience)
-(NSNumber*) lengthAsNumber;
@end
上述代码的含义是,类别的名称是NumberConvenience,而且该类别将向NSString类中添加方法。即向NSString类中添加一个名称为NumberConvenience的类别。只要保证类别名称的唯一性,可以向一个类中添加任意多的类别。另外,类别中不能声明实例变量。
** 类别实现
在@implementation部分实现自己的方法
@ implementation NSString (NumberConvenience)
-(NSNumber*) lengthAsNumber{
//实现代码。。。
}
@end
类别的局限性:1.不能添加新的实例变量;2.名称冲突,即类别中的方法与现有的方法重名。当发生名称冲突时,类别具有更高的优先级。
20.委托(不太懂),方法的选择器
利用类别可以声明非正式协议。非正式协议是NSObject的一个类别,它可以列出对象能够相应的方法。非正式协议用于实现委托,委托是一种允许你轻松定制对象行为的技术。
选择器是一种在代码中指定特定的Objective-C消息的方法。
21.正式协议
*)下面介绍协议的声明
@protocol NSCopying
-(id)copyWithZone:(NSZone*) zone;
@end
注意协议的声明时,协议名称必须唯一,协议的每一个采用者都必须实现这些方法,使用协议不引入新的实例变量。
*)采用协议
@interface Car:NSObject <NSCopying,NSCoding>{//采用了两个协议
//实例变量
}
//方法声明
@end
注意###:协议名称是使用尖括号括起来的,当采用多个协议时,可以按任意顺序列出,没有先后顺序的影响。
22.复制(copy)分为浅层复制(shadow copy)和深层复制(deep copy)。
浅层复制:不复制引用对象,新复制的对象只只想现有的引用对象。NSArray类的copy方法是浅层复制,当复制一个NSArray类的对象时,你复制的对象只复制指向引用对象的指针,而不复制引用对象本身。如果复制一个NSArray类的对象,该对象包含5个NSString类的对象,则你最终得到的是5个可供程序使用的字符串对象,而不是10个字符串对象。
深层复制:将复制所有的引用对象。如果NSArray类的copy方法是深层复制,则在复制操作完成后得到10个可用的字符串对象。