来北京一个星期了,去西藏流浪的计划也未能去实施,那就明年吧,先好好干一年,晃悠太久了,该花一段时间去认真做点事情了。西藏。。明年再去吧。
来北京做iphone开发,大学的时候励志要当程序员,结果大学从做完电赛就一直玩,玩了两三年,几乎荒废了,本来不准备写程序了,各种机缘巧合又开始了代码生涯,人生就是一段修行,既然来了,就好好修行。
iphone开发了解了一下,需要学习Objective-c和xcode,Cocoa类什么的,这几天一直在看Objective-c,以前一直做过程控制,对面向对象还是没有什么了解,要逐步培养自己面向对象思维。下面是自己的读书笔记,写下来,方便以后查阅。前几章写在本子上了。
现在在看《Objective-c 基础教程》
第八章
1。Cocoa Foundation框架中有很多有用的、面向数据的低级类和数据类型
2。Foundation框架拥有100多个类,这些文档存放在/Developer/ADC Reference Library/documentation/index.html
3。test:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
...
[pool drain];
//这是Cocoa内存管理,开始创建(通过alloc)并初始化(通过init)了一个NSAutoreleasePool实例,在结尾,池被排空。
4。NSMakeRange(); 快捷方式赋值,for example: NSRange range = NSMakeRange(17,4);
5.几个几何数据类型
typedef struct _NSPoint
{
float x;
float y;
}NSPoint;//代表的是笛卡尔平面一个点(x,y)
typedef struct _NSSize
{
float width;
float height;
}NSSize; //NSSize用来存储长度和宽度
typedef struct _NSRect
{
NSPoint orign;
NSSize size;
}NSRect; //矩形数据类型;
//Cocoa 也为我们提供了创建数据类型的快捷函数 :NSMakePoint(),NSMakeSize()和NSMakeRect();
6.Cocoa中用来处理字符串的类:NSString
7.NSString 的stringWithFormat :通过格式字符串和参数来创建NSString
+ (id) stringWithFormat: (NSString *) format, … ;
//后面的 ", …"表示可以接收多个以逗号隔开的参数,前面的 +号表示的概念:
一个类的方法有两种,一种是类方法,一种是实例方法。
类方法有点像静态方法,它属于一个类,二不是属于一个类的实例,定义时前面用“+”号
而实例方法就是属于一个类的实例的方法,定义时前面用“-”号
for example:
+ (id)allobjective-c;//这是一个类方法
-(void)dosomething;//这是一个实例方法
//在Objective-c里面没有 public和private的概念,可以认为全是 public,用加号的意思就是其它函数可以直接调用那个这个类中的这个函数,而不用创建这个类的实例。
//about id: Objective-c有一种特殊的数据类型是id,在O-c里,一切东西都是指针形式保存,获取到的就是这个对象在内存的位置。那么id就是你知道这个位置,但是不知道里面是啥的时候的写法。
创建新的字符串:
NSString *height; height * [NSString stringWithFormat: @"You height is %d feet. %d inches",5,11];
8. -(unsigned int ) length; 属于NSString,返回的是字符串中的字符个数。
使用方法: unsigned int length = [height length];
注:length方法能够准确的处理国际字符串。
9.字符串比较: isEqualToString,声明:
- (BOOL) isEqualToString: (NSString *) aString; //放回一个BOOL类型
10。isEqualToString 和compare的区别??
11. compare:options: 不区分大小写比较
- (BOOL) isEqualToString: (NSString *) aString; //放回一个BOOL类型
12。判断字符串是否孩包含别的字符串
-(BOOL) hasPrefix:(NSString *)aString; -(BOOL) hasSuffix: (NSString *) aString;
13.NSString是不能改变的,可以改变它的子类 NSMutableString,可以改变这个子类
14。COCOa提供了许多集合类,如:NSArray 和NSDictionary,(他们的实例就是为了存储其它对象而存在的)。
//NSArray :用来存放对象的数组,(类似c中的数组概念,只是这个数组是存放的对象)
NSArray有两个限制:
<1>只能存储Objective-c对象,不能存放C语言的基本数据(如int,float).
<2>不能在NSArray中存储nil(对象的零值或NULL值),因为数组的最后一个值就是nil。
//可以通过类方法arrayWithObjects:创建一个新的NSArray
for example:
//---------> NSArray *array; array = [NSArray arrayWithObjects: @"one", @"two", @"three", nil]; //---------<创建了一个由3个对象元素组成的数组NSString
- (unsigned) count; //获得NSArray所包含的对象 - (id) objectAtIndex: (unsigned int) index; //获取特定索引处的对象,调用方法 [array objectAtIndex: index]
for example:
//------> int i; for (i =0; i< [array count]; i++) { NSLog (@"index %d has %@,",i, [array objectAtindex:i ] ); } //输出NSArray 数组的个数和内容 //------<
15. 在Cocoa中,看到字符“CF",就是与CoreFoundation框架相关的内容。CoreFoundation框架与Cocoa一样,但是是用c写的,内容开源。
16。NSSrting是不可变对象的数组,NSMutableArray 是可变对象的数组,可以对元素进行添加和删除。
创建方法:
+ (id) arrayWithCapacity: (unsigned) numitems; //NSMutableArray通过类方法arrayWithCapacity来创建新的可变数组
for example:
//-----------> NSMutableArray *array; array = [NSMutableArray arrayWithCapacity: 17]; //-------------<注意创建NSString是用的arrayWithObjects,创建NSMUtalbeArray是用的arrayWithCapacity
在数组末尾添加对象的方法:
- (void) addobject: (id) anObject; for example: [array addObject: tire];
删除对象:
- (void) removeObjectAtIndex: (unsigned) index; for example: [array removeObjectAtIndex: 1];
17.NSEnumerator 对NSArray进行查找操作(书上写的枚举,开始一直没搞明白),C数组查找元素,只用指针+number就可以了,但是NSArray不行,遍历NSArray必须借助于枚举器 NSEnumerator
向数组请求枚举器"
-(NSEnumerator *) objectEnumerator;
//for example;
NSEumerator *enumerator; enumerator = [array objectEnumerator]
获得枚举器之后,开始while循环,每次循环向枚举器请求nextObject
-(id) nextObject;
nextObject返回nil值时,循环结束
//for example
NSEnumerator *enumerator; enumerator = [array objectEnumerator]; id thingie; while(thingie = [enumerator nextObject]) { NSLog(@"i found %@,thingie); } //遍历数组的实例
//疑问,书上说“对可变数组进行枚举操作,不能通过添加或删除对象这类方式来改变数组容器”这句话不太明白,可以边遍历边修改内容吗?或者说是对可变数组NSMutableArray 不能边遍历边修改?
18。快速枚举,仅在Object-c 2.0版本
//
for(NSString *string in array) { NSLog(@" I found %@",string); } //这个循环体将会遍历数组中的每个元素,并且用变量string存储每个数组值。
19。遍历数组NSArray的三种方法:
<1>.索引 // [array objectAtIndex:i] ,( -(unsigned) objectAtIndex: (unsigned int ) index;
<2>.使用NSEnumerator
<3>,快速枚举
19.NSDictionary
字典:关键字和定义的集合。//字典也被称为散列表或关联数组,和NSString,NSArray一样是不可变的,NSMutableDictionary类允许随意 添加和删除字典元素
创建字典: dictionaryWithObjectsAndKeys:
+ (id) dictionaryWithObjectsAndKeys:
(id) firstObject, ,,, ;
//该方法接收对象和关键字交替存储,以nil值作为终止符号。
for example:
//------------------ Tire *t1 =[Tire new]; Tire *t2 =[Tire new]; Tire *t3= [Tire new]; Tire *t4= [Tire new]; NSDictionary *tires; tires = [NSDictionary dictionaryWithObjectsAndKeys: t1,@"front-left",t2,@"front-right", t3,@"back-left",t4,@"back-right",nil]; //---------------------
查找字典中的值可以用: objectForKey;
- (id) objectForKey: (id) aKey;
for example:
//------------------- Tire *tire = [tires objectForKey:@"back-right"]; //------------------如果没有找到,则返回nil值
NSMutableDictionary //可变字典
创建 : dictionaryWithCapacity
+ (id) dictionaryWithCapacity: (unsigned int ) numItems;
setObject:forkey: 给字典添加元素
-(void) setObject:(id) anObject forKey: (id) aKey;
//---------------->另外一种存储轮胎字典的方法 NSMutableDictionary *tires; tires = [NSMutableDictionary dictionary]; [tires setObject: t1 forKey: @"front-left"]; [tires setObject: t2 forKey: @"front-right"]; [tires setObject: t3 forKey: @"back-left"]; [tires setObject: t4 forKey: @"back-right"]; //------------------<如果对字典已有的关键字是用setObject:forKey: 则替代
删除可变字典关键字: removeObjectForKey:方法
- (void) removeObjectForKey: (id) aKey: for example: //------------------- [tires removeObjectForKey: @"back-left"];
20. 类簇概念,如NSLiterlString .NSCFString,NSSimpleCString,NSBa110fString形成一个与NSString相关的类簇,创建NSString对象时,可能获得上面几个相关的对象。给类簇创建子类是困难的,所以不要试图创建NSString.NSArray.NSDictionary的子类
21。NSNuber //用来包装基本数据类(即把基本数据类型以对象形式实现)
//四个常用的创建方法
+ (NSNumber *) numberWithChar: (char) value; + (NSNumber *) numberWithInt: (int) value; + (NSNumber *) numberWithFloat: (float) value; + (NSNumber *) numberWithBool: (BOOL) value;
for example:
//----------------> NSNumber *number; number = [NSNumber numberWithInt:42]; [array addObject: number]; [dictionary setObject: number forKey: @"Bork"];
//把数据封装到NSNumber中后,可以通过下面的实例方法重新获得:
- (char) charValue; - (int) intValue; - (float) floatValue; -(BOOL) boolValue; - (NSString *) stringValue;
注:Objective-c语言不支持自动装箱
22.标签的概念:
标签是用于判断对应参数用途的一个标记,名字可以随便取,多参数时,除第一个参数以外,别的参数都要写标签,如:
(void) func2: (int) n labe1:(int) m labe2:(int) p {}
或者写成:
(void) func2: (int) n labe1: (int) m labe2:(int) p {}
23.NSValue //NSNumber 是NSValue的一个子类
24. NSNull
+ (NSNull *) null;
添加方法:
[ contact setObject: [NSNUll null] forKey:@"home fax machine"];
访问方法:
id homefax: home fax = [ contact objectForKey: @"home fax machine"]; if (home fax == [NSNull null) { //..no fax machine }