基本数据类型
协议protocol
在ObjC中使用@protocol定义一组方法规范,实现此协议的类必须实现对应的方法。熟悉面向对象的童鞋都知道接口本身是对象行为描述的协议规范。
Fundation框架
一、什么是Cocoa
Cocoa不是一种编程语言(它可以运行多种编程语言),它也不是一个开发工具(通过命令行我们仍然可以开发Cocoa程序),它是创建Mac OS X和IOS程序的原生面向对象API,为这两者应用提供了编程环境。
我们通常称为“Cocoa框架”,事实上Cocoa本身是一个框架的集合,它包含了众多子框架,其中最重要的要数“Foundation”和“UIKit”。前者是框架的基础,和界面无关,其中包含了大量常用的API;后者是基础的UI类库,以后我们在IOS开发中会经常用到。这两个框架在系统中的位置如下图:
Cocoa框架二、NSObject
所有的Mac OS X和IOS程序都是由大量的对象构成,而这些对象的根对象都是NSObject,NSObject就处在Foundation框架之中。通常我们会将他们分为几类:
- 值对象
- 集合
- 操作系统服务:文件系统、URL、进程通讯
- 通知
- 归档和序列化
- 表达式和条件判断
- Objective-C语言服务
三、常用结构体:NSRange、NSPoint、NSSize、NSRect等
常用结构体在Foundation框架中都有一个对应的make
方法进行创建,这也是我们日后比较常用的操作;而且与之对应的还都有一个NSStringFromXX
方法来进行字符串转换,方便我们调试。下面提到NSSize其实就是CGSize,NSRect其实就是CGRect.
-
NSRange 表示一个范围
- 定义:
NSRange rg = {3, 5};
- Make定义
NSRange rg = NSMakeRange(3,5);
- 第一参数是起始位置第二个参数是长度:
rg.location = 3; rg.length = 5;
- 定义:
-
NSPoint 表示Cartesian坐标系中的一个点,
typedef CGPoint NSPoint;
- Make定义
NSPoint p = NSMakePoint(10, 15);
- 或者使用CG方法定义
NSPoint p2 = CGPointMake(10, 15);
- 两个参数分别表示x轴和y轴
p1.x = 10; p1.y = 15
- Make定义
-
NSSize 表示一个二维的size,
typedef CGSize NSSize;
- 定义方法同上
NSSize s = NSMakeSize(10, 15);CGSize s2 = CGSizeMake(10, 15);
- 两个参数width, height,
s.width = 10; s.height = 15;
-
NSRect 表示一个矩形,
typedef CGRect NSRect;
- 定义方法同上
NSRect r = NSMakeRect(10,5,100,200); NSRect r2 = CGRectMake(10,5,100,200);
- 两个参数分别为NSPoint型的origin和NSSize型的size
四、日期:NSDate,NSTimeInterval,NSDateFormatter
Symbols
-
date 新建并返回一个新的日期
NSDate *today = [NSDate date];//获得当前日期 -
dateWithTimeIntervalSinceNow: 创建并返回一个距离当前日期秒数的NSDate对象
+(instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;//方法
NSDate *date2=[NSDate dateWithTimeIntervalSinceNow:100];//在当前日期的基础上加上100秒 -
distantFuture 随机获取一个未来日期
NSDate *date3=[NSDate distantFuture];
五、字符串
- 不可变字符串NSString
-
字符串定义
1) char *str1="C string";
2) NSString *str2=@"OC string";//ObjC字符串需要加@,并且这种方式创建的对象不需要自己释放内存
//下面的创建方法都应该释放内存
3) NSString *str3=[[NSString alloc] init]; str3=@"OC string";
4) NSString *str4=[[NSString alloc] initWithString:@"Objective-C string"];
5) NSString *str5=[[NSString alloc] initWithFormat:@"age is %i,name is %.2f",19,1.72f];
6) NSString *str6=[[NSString alloc] initWithUTF8String:"C string"];//C语言的字符串转换为ObjC字符串
//以上方法都有对应静态方法(一般以string开头),不需要管理内存(系统静态方法一般都是自动释放)
7) NSString *str7=[NSString stringWithString:@"Objective-C string"]; -
NSString对象的方法
NSString str1 = @"Hello world!";
//uppercaseString,大写
NSLog(@"%@",[str1 uppercaseString]);//结果: HELLO WORLD!
//lowercaseString,小写
NSLog(@"%@",[str1 lowercaseString]);//结果: hello world!
//capitalizedString首字母大写,其他字母小写
NSLog(@"%@",[str1 capitalizedString]);//结果:Hello World!
//isEqualToString: 两字符串是否相等
BOOL result= [@"abc" isEqualToString:@"aBc"];//结果:result=false
//hasPrefix: 前缀
NSLog(@"%i",[str hasPrefix:@"He"]);// result:1
//hasSuffix: 后缀
NSLog(@"%i",[str1 hasSuffix:@"ld!"]);//result:1
//intValue 类型转换
NSLog(@"%i",[@"12" intValue]);//result: 12
//length 字符串长度
NSLog(@"%zi",[@"hello world,世界你好!" length]);//结果:17
//characterAtIndex:取出单个字符
NSLog(@"%c",[@"abc" characterAtIndex:0]);//取出制定位置的字符,结果:a
-
可变数组NSMutableString
-
字符串定义
NSMutableString *str1= [[NSMutableString alloc] initWithCapacity:10];
[str1 setString:@"hello"];//设置字符串 -
方法
1) setString 设置
[str1 setString:@"hello"];//设置字符串
2) appendString 追加
[str1 appendString:@",world!"];//追加字符串,结果:hello,world!
3) appendFormat 格式化追加
[str1 appendFormat:@"我的年龄是%i。dear,I love you.",18];
4) replaceCharactersInRange:NSRange withString:NSString 替换
NSRange range=[str1 rangeOfString:@"dear"];
[str1 replaceCharactersInRange:range withString:@"Honey"];
5) insertString:NSString atIndex: NSNumber插入字符串
[str1 insertString:@"My name is Kenshin." atIndex:12];
6) deleteCharactersInRange:NSRange 删除指定字符串
[str1 deleteCharactersInRange:[str1 rangeOfString:@"My name is Kenshin."]];
-
六、数组
-
不可变数组NSArray
-
定义
//NSArray长度不可变所以初始化的时候就赋值,并且最后以nil结尾 1) NSArray *array1 = [[NSArray alloc] initWithObjects:@"abc",obj,@"cde",@"opq", nil]; 2) NSArray *array1 = [NSArray arrayWithObjects:@"abc",obj,@"cde",@"opq",@25, nil]; 3) NSArray *array2 = @[@"abc",obj,@"cde",@"opq",@25]; >#注意这里用@[]直接初始化数组,而直接初始化字典用@{},注意区分!!
-
属性和方法
1) count : NSLog(@"%zi",array1.count);//数组长度,结果:5 #containsObject: 2) NSLog(@"%i",[array1 containsObject:@"cde"]);//是否包含某个对象,结果:1 #lastObject 3) NSLog(@"%@",[array1 lastObject]);//最后一个对象,结果:25 # indexOfObject: 4) NSLog(@"%zi",[array1 indexOfObject:@"abc"]);//对象所在的位置:0
-
数组遍历(待续.....)
-
数组排序
- 方法1,使用自带的比较器
NSArray *array=[NSArray arrayWithObjects:@"3",@"1",@"2", nil];
NSArray *array2= [array sortedArrayUsingSelector:@selector(compare:)]; - 方法2,(待续。。。)
- 方法1,使用自带的比较器
-
- 注意
- NSArray中只能存放对象,不能存放基本数据类型,通常我们可以通过在基本数据类型前加@进行转换;
- 数组中的元素后面必须加nil以表示数据结束;
- 上面数组操作中无论是数组的追加、删除、截取都没有改变原来的数组,只是产生了新的数组而已;
- 对象的比较除了使用系统自带的方法,我们可以通过自定义比较器的方法来实现;
- 可变数组NSMutabelArray
-
定义
Person *person1=[Person personWithName:@"Kenshin"]; Person *person2=[Person personWithName:@"Kaoru"]; Person *person3=[Person personWithName:@"Rosa"]; NSMutableArray *array1=[NSMutableArray arrayWithObjects:person1,person2,person3, nil];
-
属性和方法
Person *person4=[Person personWithName:@"Jack"];//此时person4的retainCount为1 #addObject: 添加一个对象元素 [array1 addObject:person4];//添加一个元素,此时person4的retainCount为2 #removeObject: [array1 removeObject:person3];//删除一个元素 #removeLastObject [array1 removeLastObject];//删除最后一个元素 #removeAllObjects [array1 removeAllObjects];//删除所以元素 //注意当往数组中添加一个元素时会retain因此计数器+1,当从数组中移除一个元素时会release因此计数器-1 //当NSMutalbeArray对象release的时候会依次调用每一个对象的release
七、字典
-
初始化
#dictionaryWithObject NSDictionary *dic1=[NSDictionary dictionaryWithObject:@"1" forKey:@"a"]; #dictionaryWithObjectsAndKeys NSDictionary *dic2=[NSDictionary dictionaryWithObjectsAndKeys: @"1",@"a", @"2",@"b", @"3",@"c", nil]; #dictionaryWithObjects:NSArray forKeys:NSArray NSDictionary * dic3=[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1",@"2", nil] forKeys:[NSArray arrayWithObjects:@"a",@"b", nil]]; #更简单的方式 NSDictionary *dic4=@{@"1":@"a",@"2":@"b",@"3":@"c"};
-
方法
NSDictionary *dic1=[NSDictionary dictionaryWithObjectsAndKeys: @"1",@"a", @"2",@"b", @"3",@"c", @"2",@"d", nil]; # count NSLog(@"%zi",[dic1 count]); //结果:4 # valueForKey: NSLog(@"%@",[dic1 valueForKey:@"b"]);//根据键取得值,结果:2 #[]直接引用建 NSLog(@"%@",dic1[@"b"]);//还可以这样读取,结果:2 #allKeys, allValues NSLog(@"%@,%@",[dic1 allKeys],[dic1 allValues]); #removeObjectForKey: 删除一个元素 [dic1 removeObjectForKey:@"b"]; #addEntriesFromDictionary: 添加元素 [dic1 addEntriesFromDictionary:@{@"e":@"7",@"f":@"6"}]; #setValue 重新设置键值 [dic setValue:@"5" forKey:@"a"];
-
遍历
-
方法1: for key in dic =>key, [dic objectForKey:key]
for (id key in dic1) { //注意对于字典for遍历循环的是key
NSLog(@"%@=%@",key,[dic1 objectForKey:key]);
} -
方法2: 使用迭代器
NSEnumerator *enumerator=[dic1 keyEnumerator];
id key=nil;
while (key=[enumerator nextObject]) {
NSLog(@"%@=%@",key,[dic1 objectForKey:key]);
} -
方法3: 使用代码块
[dic1 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@=%@",key,obj);
}];
-
八、拆箱和装箱
-
简介
数组和字典中只能存储对象类型,其他基本类型和结构体是没有办法放到数组和字典中的。当然你也是无法给它们发送消息的(也就是说有些NSObject的方法是无法调用的),这个时候通常会用到装箱(boxing)和拆箱(unboxing)。其实各种高级语言基本上都有装箱和拆箱的过程,例如C#中我们将基本数据类型转化为Object就是一个装箱的过程,将这个Object对象转换为基本数据类型的过程就是拆箱,而且在C#中装箱的过程可以自动完成,基本数据类型可以直接赋值给Object对象。但是在ObjC中装箱的过程必须手动实现,ObjC不支持自动装箱。在ObjC中我们一般将基本数据类型装箱成NSNumber类型(当然它也是NSObject的子类,但是NSNumber不能对结构体装箱),调用其对应的方法进行转换。
-
装箱方法
+(NSNumber *)numberWithChar:(char)value; +(NSNumber *)numberWithInt:(int)value; +(NSNumber *)numberWithFloat:(float)value; +(NSNumber *)numberWithDouble:(double)value; +(NSNumber *)numberWithBool:(BOOL)value; +(NSNumber *)numberWithInteger:(NSInteger)value;
-
拆箱方法
-(char)charValue; -(int)intValue; -(float)floatValue; -(double)doubleValue; -(BOOL)boolValue;
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
网友评论