1、过程式程序是建立在函数之上,数据为函数服务,面向对象编程以数据为中心,函数为数据服务。
2、for(i=0;i<count;i++){
id shape=shapes[i];
[shape draw];
}
id是一种泛型,用于表示任何种类的对象,对象是有代码的C struct,id实际上是一个指针,指向其中的某个结构。
id shape=shapes[i]:代码从shapes数组中获取id(即指向某个对象的指针),并将其赋值给名为shape(具有id类型的变量)的变量,这只是一种指针赋值过程,实质上并不会复制shape的全部代码
[shape draw]执行过程:
(1)、查询消息的目标对象,看其属于什么类
(2)、该类查找其代码块,然后获取draw函数的地址
(3)、运该代码
3、向对象发送消息,如何调用相应的代码---通过类来实现
对象含有一个指向其类的指针,类是一种结构,用于描述该种类对象的构造,而类含有一个指针用于指向其实现其他必要功能的代码。
4、术语介绍
(1)、类是一种结构,表示对象的类型,对象引用类来获取和本身相关的各种信息,特别是运行什么代码来处理每种操作。
(2)、对象是一种结构,它包含值和指向其类的隐藏指针。
(3)、实例是对对象的另一种称呼。
(4)、消息是对象可以执行的操作
(5)、方法是为相应消息而运行的代码
(6)、接口是对象的类应该提供的特性的描述
(7)、@interface Circle:NSObject:@interface Circle告诉编译器,这是为名为Circle的新类定义的新接口
(8)、@interface Circle:NSObject{
ShapeColor filllColor;Circle类对象的实例变量
ShapeRect bounds;
}每次创建Circle对象,对象中都包括这两个元素
(9)、-(void) setFillColor:(ShapeColor) fillColor;方法声明
-:表明这是OC的声明方法,这是一种区分函数原型和方法声明的方式
(void):方法返回的类型 (ShapeColor) :参数类型
fillColor:参数名 setFillColor:方法名称,如果有参数,有:,否则没有
(10)、@end:表明完成了对类的声明
(11)、@implementation Circle:表明你将为某个类提供代码,结尾无分号,OC编译器指令后无分号
5、继承
超类:
@interface Shape:NSObject(OC不支持多继承)
{ ShapeColor fillColor;
ShapeRect bounds;
}
-(void) setFillColor:(ShapeColor) fillColor:
-(void)setBounds:(ShapeRect) bounds;
-(void)draw;
子类
@interface Circle:Shape//创建一个新类时,其对象首先从自身的超类中继承实例变量,然后添加他们自己的实例变量。
@end
方法调度:向Circle对象发送setFillColor:消息时,调度程序首先询问是否用自身的代码相应setFillColor:方法,在本例中,是不能,因此,它将在超类中查找对应的方法,然后找到Shape类根部,找到该方法,然后运行该代码。否则在最高级别的超类中(NSObject)中寻找,若也没有该方法,则运行出错。
[super draw];向super发送消息时,实际上是在请求OC向该类的超类发送消息,如果该超类中没有定义该方法,则按照通常的方式在按照继承链继续寻找。
%p:打印地址
6、关于alloc和init`(alloc和init是两个分离的操作)
NSString *name=[NSString alloc];
NSLog(@"%p",name);
name=[name init];
NSLog(@"%p",name);
两个内存地址不一样
2014-07-07 13:19:51.724 LessonMRC2[1222:303] 0x100203850
2014-07-07 13:19:51.726 LessonMRC2[1222:303] 0x7fff73ada7b8
alloc是开辟一个内存空间,init是初始化,为什么没有在原有内存空间上进行初始化,而是开辟了一个新空间。
NSObject *obj=[NSObject alloc];
NSLog(@"%p",obj);
obj = [obj init];
NSLog(@"%p",obj);
打印之后:
2014-07-07 13:23:10.663 LessonMRC2[1232:303] 0x100103730
2014-07-07 13:23:10.663 LessonMRC2[1232:303] 0x100103730地址一样
为什么NSString的内存地址不一样,而NSObject一样,分析原因:
NSString的初始化方法:
-(id)init
{
if(self=[super init])//[super init]使超类完成自己的初始化工作,实例变量所在的内存位置到隐藏指针self的距离 是固定的,如果init方法返回一个新对象,则需更新self,以便之后的实例变量的引用能映射到正确的内存位置,self=[super init]赋值就是这个作用,只影响init方法中self的值,不影响init范围以外的内容。初始化一个对象出错时,返回nil。
{
..............
}
return self;//init方法返回已经被初始化的对象,我们已经将[super init]的返回值赋给self,即返回self
}
即如果[super init]不为空,就重新分配内存空间,这就是地址不一样的原因。
而NSObject的地址是一样的,因为NSObject是一切类的基类,当[[NSString alloc]init]执行时,调用[super init]就是执行NSObject里面的init方法,
NSObject身为基类,他也就无法调用super init, 所以 当NSObject执行 [[NSObject alloc]init]时,也就没有了init重新分配空间这一环节
NSString alloc之后,没有init,那么这部分alloc后的内存空间可不可以用?答案是显而易见的,如果可以用,苹果公司也就没必要提供一个init方法,alloc后的指针称为悬挂指针. 如果一个地方指针既不为空,也没有被设置为指向一个已知的对象,则这样的指针称为悬挂指针
,在程序里面是很危险的事.
7、alloc和new的
区别
1、alloc是OS获得一块内存并指定为存放对象的实例变量的位置。同时alloc方法还将这块内存区域全部初始化为0。BOOL初始化为NO,int初始化为0,float初始化为0.0,指针初始化为nil.
2、 new基本等同于alloc init
,区别只在于alloc分配内存的时候使用了zone.
zone是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度
3、如果使用new的话,初始化方法被固定死只能调用init. 而你想调用initXXX怎么办。。。实际代码中很少会用到new.
8、类方法和实例方法
类方法被限定在类范围内,不能被类的实例调用(即脱离实例运行)。alloc就是一种类方法。实例方法限定在对象实例的范围内(即实例化之前不能运行)。init就是一种实例方法,被alloc方法返回的对象实例调用。
9、Foundation kit框架
NSArray
a:类方法创建一个新的NSArray:[NSArray arrayWithObjects:@"",
“”,nil]
-(unsigned) count;
-(id) objectAtIndex:(unsigned int)index;
-(
void) addObject:(id) Object;
-(void)removeObjectAtIndex:(unsigned)index;
NSDictionary
a:类方法dictionaryWithObjectsAndKeys:来创建字典,该方法接收对象和关键字交替存储的系列,以nil值作为终止符
。
-(id) objectForKey:(id)key
-(void)setObject:(id) object forKey:(id)key;(查找)
removeObjectForKey:(删除)
几何数据类型
这些数据类型是C-struct而不是对象,是因为性能。所有的OC对象都是动态分配内存的,而动态分诶内存是一个代价较高的操作,它会消耗大量的时间,所以将这些结构创建成第一等级的对象会在使用过程中增加大量的系统开销。
NSString
类方法
---stringWithFormat
:创建的是类对象,类对象包含了指向超类的指针,类名和指向类方法列表的指针
比较:注意i
sEqualToString:和==的区别
不区分大小写的比较:-(NSComparionResult) compare:(NSString*)string options:(unsigned) mask;
options参数是一个位掩码NSCaseInsensitiveSearch(不区分大小写比较) NSLiteralSearch(进行完全比较)
NSNumericSearch(比较字符串的字符个数),这三个参数之间用"|"隔开。
字符串中是否包含其他字符串
-(BOOL) hasPrefix:(NSString*) string;以...开头
-(BOOL)hasSuffix:(NSString*) string;以...结尾
-(NSRange) rangeOfString:(NSString *) string;中间包含某个字符串
添加
appendString(添加String) appendFormat(添加格式符之类的)
删除
NSMutableString * friend;
[friend appendString:@"James BethLynn Jack Evan"];
NSRange jackRange;
jackRange=[friend rangeOfString:@"Jack"];
[friend deleteCharactersInRange:jackRange];