面向对象具有良好的可扩展性和重用性
描述类即描述的是这个类的特点,类指的是一个大的类别,如:一类人,对象时类中的一个
+ (id)alloc; +表⽰示这个⽅法属于类,只能类执行。id返回值类型,表示任意类型的对象,即创建好的对象。
- (id)init; -表⽰示这个⽅法属于对象,只能对象执行。id返回值 类型,表示初始化完成的对象。
@public是公有的可以任意访问,但是相对的数据的安全性就得不到保证,可以任意进行修改.另外使用@public,暴露了内部的细节,同时也不符合面向对象语言三大特点之一的封装.
如果在其他的文件中想要访问对象@protected修饰的实例变量时,添加方法 使用setter设置器和getter访问器就行
用import引入头文件容易引起交叉导入,导致错误 所以这时候应该使用@class ,用@class可以防止交叉引入头文件的问题,系统会把A当做是一个已经存在的类来使用,不会把A.h的内容进行拷贝,就是用了一下A的名,其他不做任何的检测.告诉编译器@class后的字符串作为类名使用,并未导入类的 接口内容。有效避免嵌套循环导入
给super发消息,可以执⾏父类中实现的方法。
完整的初始化方法:
当这个对象在初始化过程中出现问题即self处,会返回一个空指针,如果是空指针接下来的赋值就没有任何意义了,跳过去,如果返回是一个正常的堆空间地址,才能继续赋值
当对象在执行方法的时候,子类重写了父类的方法,系统会优先使用子类的方法,如果没有重写,则用父类的方法
属性
属性的实现:关键字是@synthesize,前面放属性名,后面放对应的成员变量在XCode4.5之后开始不写的,所以在之前的工程里,还有大量的@systhesize,XCode4.5之后@synthesize name = _name;这个也包含在@property中
属性的属性
属性的属性一共有3类:
1.读写性控制(readonly、readwrite、setter、getter)
readonly,告诉编译器,只声明getter方法(无setter方法)。
readwrite,告诉编译器,既声明setter⼜又声明getter。同时也是默认的设置
2.原⼦性控制(nonatomic、atomic)
atomic。setter、getter方法在多线程访问下是绝对安全的,即 setter、getter内部做了多线程访问处理。原子性控制的默认设置是 atomic
nonatomic。setter、getter⽅法内部不会做多线程访问处理,仅是 普通的setter、getter方法
3.语义设置(assign、retain、copy)
assign。setter、getter内部实现是直接赋值。
retain。setter、getter的内部实现会做内存优化。
copy。setter、getter的内部实现也会做内存优化。
如果属性是非对象类型(比如int,float等)属性的语义设置使用 assign。 如果属性是对象类型(比如NSStrng、NSArray等)属性的语义设 置使⽤用retain。 如果属性是对象类型并且想得到参数的copy,使⽤用copy关键字。
KVC
KVC(Key-Value-Coding),键值编码,是⼀种间接访问实例变量的⽅法。 key:键,⽤用于标识实例变量
vlaue:实例变量对应的值
NSString:不可变字符串
创建NSString之后,内容和长度不能更改
1.用字面量的方式创建字符串对象
NSString *str = @"散一夕暧昧和倾一摇温柔";
NSString *str1 = @[@"散一夕暧昧",@"倾一摇温柔"];
2.打印字符串的长度
NSLog(@"%ld", str.length);
——>11
3.通过指定的下标获取字符串内容
NSLog(@"%C", [str characterAtIndex:3]);
——>暧
注意:小的%c打印字母数字等大的%C才能打印汉字
4.用便利构造器的方法创建字符串
NSString *str2 = [NSString stringWithString:@"女神之手巫妖王正在苏醒"];
5.字符串的截取
5.1 打印指定下标到结尾的字符串内容
NSLog(@"%@", [str2 substringFromIndex:4]);
——>巫妖王正在苏醒
5.2 打印开头到指定下标的字符串内容
NSLog(@"%@", [str2 substringToIndex:4]);
——>女神之手
5.3 字符串截取
(1) NSRange range = {4, 7};
NSLog(@"%@", [str2 substringWithRange:range]);
——>巫妖王正在苏醒
(2) NSLog(@"%@", [str2 substringWithRange:NSMakeRange(4, 7)]);
——>巫妖王正在苏醒
6.判断两个字符串内容是否相同
NSLog(@"%d", [str isEqualToString:str1]);
——> 0
7.判断是否有前缀
7.1前缀
NSString *prefix=@"女神之手";
NSLog(@"%d", [str2 hasPrefix:prefix]);
——> 1
7.2 后缀
NSString *suffix=@"苏醒了";
NSLog(@"%d", [str2 hasSuffix:suffix]);
——> 0
8. 把字符串转换成基本数据类型
NSString *strNum = @“1234p5";
NSInteger num = [strNum integerValue];
NSLog(@"%ld", num);
——> 1234
9.把任意类型转换成字符串类型
CGFloat blood = 87.5;
NSInteger level = 90;
NSString *str3 = [NSString stringWithFormat:@"%@, %ld, %g", @"忘忧", level, blood];
NSLog(@"%@", str3);
——>昵称:忘忧, 等级:90, 血量:87.5
10.字符串的大小写设置
NSString *strCase = @"shenmODalu RonGYaozHIrenG";
- 将所有的小写字母都变成大写
NSLog(@"%@", str.uppercaseString);
——> SHENMODALU RONGYAOZHIRENG
- 将所有的大写字母都变成小写
NSLog(@"%@", strCase.lowercaseString);
——> shenmodalu rongyaozhireng
- 除了首字母大写其他字母都小写
NSLog(@"%@", strCase.capitalizedString);
——> Shenmodalu Rongyaozhireng
11.字符串的比较
NSString *str = @"nihao";
NSString *newStr = @"buhao";
NSLog(@"%ld", [str compare:newStr]);
——> 1
NSString *str1 = @"buhao";
NSString *newStr1 = @"nihao";
NSLog(@"%ld", [str1 compare:newStr1]);
——> -1
NSString *str2 = @"buhao";
NSString *newStr2 = @"buhao";
NSLog(@"%ld", [str2 compare:newStr2]);
——> 0
12.字符串的拼接
NSString *str1 = @"叶寒";
NSString *str2 = @"忘忧";
NSString *newstr = [str1 stringByAppendingString:str2];
NSLog(@"%@", newstr);
——> 叶寒忘忧
13.替换
NSString *str1 = @"叶寒";
NSString *str2 = @“忘忧";
NSString *newstr = [str1 stringByAppendingString:str2];
NSString *strNew = [newstr stringByReplacingOccurrencesOfString:@"叶寒" withString:@"散一夕暧昧"];
NSLog(@"%@", strNew);
——> 散一夕暧昧忘忧
NSMutableString可变字符串
创建NSMutableString之后内容可以修改,NSMutableString是NSString的子类
1.创建
1) NSMutableString *str = [[NSMutableString alloc] initWithString:@"叶寒"];
NSLog(@"%@", str);
——> 叶寒
2) NSMutableString *str1 = [NSMutableString stringWithString:@"忘忧"];
NSLog(@"%@", str1);
——> 忘忧
2.插入
[str insertString:@"小" atIndex:2];
NSLog(@"%@", str);
——> 叶小寒
3.替换
[str replaceCharactersInRange:NSMakeRange(1, 1)withString:@"老师"];
NSLog(@"%@", str);
——> 叶老师
4.拼接
NSString *newStr = [str stringByAppendingString:@"爱忘忧"];
NSLog(@"%@", newStr);
——> 叶老师爱忘忧
NSValue
把结构体和指针换成对象类型
结构体的,是访问成员变量,对象调用属性是点语法
NSSet集合
NSSet是无序的,NSSet不能有重复的元素,集合里的元素,必须是对象类型
1.便利构造器创建
NSSet *set=[NSSet setWithObjects:@"1",@"2",@"3",@"4",@"5",@"2", nil];
2.一般创建
NSSet *set1=[[NSSet alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
3.可变集合
NSMutableSet *set=[NSMutableSet setWithObjects:@"1",@"2",@"4",@"3",@"5", nil];
4.添加元素
[set addObject:@“6"];
5.删除元素
[set removeObject:@“1"];
6.清除所有
[set removeAllObjects];
7.快速枚举
for (NSString *str in set) {
NSLog(@“%@“,str);}
NSDate日期的类
NSDate *date=[NSDate date];
1. 获取一下当前所在时区,
NSTimeZone *zone=[NSTimeZone systemTimeZone];
2. 获取一下和0时区相差的秒数
NSInteger second=[zone secondsFromGMTForDate:date];
3. 通过相差的秒数,能获取到现在的时间
NSDate *localdate=[NSDate dateWithTimeIntervalSinceNow:second];
4. 明天此时的时间
NSDate *tomorrowDate =[NSDate dateWithTimeIntervalSinceNow:(32*3600)];
NSLog(@"%@",tomorrowDate );
5. 昨天此时的时间
NSDate *yesterday=[NSDate dateWithTimeIntervalSinceNow:-(16*3600)];
NSLog(@"%@",yesterday);
6. 时间间隔
对应的double类型
计算两个时间对象的时间间隔
NSTimeInterval interval=[tomorrowDate timeIntervalSinceDate:date];
NSLog(@"%g",interval);
7. NSDate->NSString
第一种方式
NSDate *date=[NSDate date];
NSString *dateStr=[NSString stringWithFormat:@"%@",date];
第二种方式,时间的格式yyyy-MM-dd HH-mm-ss
y-年,M-月,d-日,H-24小时制,,h-12小时制,,m-分,,s-秒
NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];
NSDate *date=[NSDate date];
NSString *strDate=[formatter stringFromDate:date];
8. 字符串->NSDate
//使用前要先定义格式
NSString *timeStr=@"2015-7-23 17-18-10";
NSDate *date=[formatter dateFromString:timeStr];