1.class
三大特征:1封装(属性封装);2继承,继承关系不可乱用,保证有多个(超过两个类)结构以及属性功能都很相似的时候再考虑使用继承;3多态,在多态方法中调用父类中的基础方法;如果子类中需要对父类中的方法有特殊的实现,可以重写父类的方法,那么在多态方法中最终调用的是子类具体重写父类的那个方法
2.Foundation框架
类:方法和属性至少有一个
类:工具类(最多的内容就是方法);数据载体(Model模型,类中最多的内容就是属性)
NSString类:专门用来处理字符串的类,凡是与字符串相关的内容马上就要去NSString.h文件中查看是否提供了解决方法
3.创建字符串
3.1 直接赋值NSString str1 = @“abc”;
3.2 格式化赋值NSString str2 = [NSString stringWithFormat:@“%d年”,2015];
3.3 C语言字符串转换成OC字符串NSString str3 = [NSString stringWithUTF8String:”hello”];
4.获得字符串长度
NSUInteger length1 = [str1 length];
NSUInteger length2 = str1.length;
5.截取字符串(hello world中h0 e1 l2 l3 o4 空格5)
5.1从给定的索引位置截取到字符串末尾,包含给定的索引位置处字符
NSString * str1 = [str substringFromIndex:1];
5.2从起始位置截取到给定索引位置,不包含给定的索引位置处的字符
NSString * str1 = [str substringToIndex:2];
5.3从给定索引位置处截取给定长度的字符串
NSRange range = {0,1};
或者NSRange range = NSMakeRange(0,1);
NSString * str2 = [str substringWithRange:range];
6.iOS中常用的结构
6.1 表示一个坐标位置
CGPoint point = NSMakePoint(1,2)
CGPoint point = CGPointMake(1, 2)
6.2 表示宽和高
CGSize size = NSMakeSize(100, 100)
CGSize size = CGSizeMake(100, 100)
6.3 表示平面内矩形
CGRect rect = NSMakeRect(1, 2, 100, 100)
CGRect rect = CGRectMake(1, 2, 100, 100)
7.判断开始结尾
7.1 hasPrefix判断字符串是否以给定的字符串开始
BOOL result = [str hasPrefix:@“www”];
7.2 hasSuffix判断字符串是否以给定的字符串结尾
BOOL result = [str hasSuffix:@“.com”];
可以用来判断文件结尾(.mp3 .rmvb)
8.用特定字符隔开
8.1 单个字符隔开componentsSeparatedByString:
NSString * str = @“a,b,c”;
NSArray * array = [str componentsSeparatedByString:@“,”]
8.2 多个字符隔开 componentsSeparatedByCharactedInSet:
NSString * str = @“a,b-d,c@f,k”;
NSCharacterSet * charSe = [NSCharacterSet characterSetWithCharacterInString:@“,-@”];
NSArray * array = [str componentsSeparatedByCharacterInSet:charSe];
9.追加操作
在字符串的末尾追加
NSString * newStr = [str stringByAppendingString:@“hello”];
使用格式化追加操作
NSString * newStr = [str stringByAppendingFormat:@“%d年”,2015];
10.字符替换(可以用来去除空格)
NSString str2 = [str stringByReplacingOccurrencesOfString:@“abc” withString@“def”];
11.判断相同性
11.1判断相同==:判断的是对象的地址如果地址相同那么必相等
11.2判断相等isEqualToString
11.3自定义函数myEqualToString
BOOL myEqualToString(NSString * str1, NSString * str2){
if(str1 == str2) return YES;
if(str1.length!=str2.length) return NO;
for(int i=0;i<str1.length;i++){
unichar str1char = [str1 characterAtIndex:i];
unichar str2char = [str2 characterAtIndex:i];
if(str1char!=str2char) return NO;
}
return YES;
}
12.包含
12.1 BOOL result = [str1 containsString:str2];
12.2 rangeOfString
NSRange range = [str1 rangeOfString:str2];
NSString * rangeString = NSStringFromRange(range);
NSLog(@“%@”,rangeString);
如果包含的话range中location就会返回字符串所在的索引位置;不包含的话location就是一个很大的数,并且这个数是不确定的,所以提供了NSNotFound来判断
if(range.location != NSNotFound){NSLog(@“包含”);}
13 比较字符串大小
NSComparisonResult compareResult = [str1 compare:str2];
if(compareResult == NSOderedAscending/NSOrderedSame/NSOrderedDescending){
NSLog(@“NSOdredAscending/NSOrderedSame/NSOrderedDescending”);
}
14 可变长字符串
//NSMutableString继承自NSString类
NSMutableString * mString = [NSMutableString string];
14.1添加
[mString appendString:@“hello”];
[mString appendFormat:@“%d”,10];
14.2 删除某个范围内的字符,操作的范围不能超出索引范围(长度)
’NSRange range = NSMakeRange(0, 3);
[mString deleteCharacterInRange:range];
14.3在具体的索引位置插入新的字符串
[mString insertString:@“www” atIndex:2];
14.4 如果调用父类中的方法,那么父类方法中处理的都是按照不可变长字符串处理的,方法也都是有返回值的(返回新的字符串)
NSString newString = [mString substringFromIndex:2];
15 数组
15.1不可变长数组
使用快捷创建的方式创建出来的数组是不可变长数组,不能用NSMutableArray接收它
NSArray * array = @[@“one”,@“two”];//而不能用NSMutalbeArray
数组结尾一定要是nil,遇到nil结束(即保存的对象也不能为nil,NSString * str = nil是不能直接保存进去的)。
例如NSArray * array = [NSArray arrayWithObject:@“one”,@“two”,nil,@“three”,nil];
经常可能遇到的错误:超出索引范围。数组的索引值从0到count-1
数组中不能直接存储基本数据类型,要想存储的话要使用包装类,进行包装后存储。
为什么不能直接存储基本数据类型呢?
因为NSArray中存储的是指针,并且通过在加入到容器中的时候retain来保证指针的有效性。OC的堆上存储是基于引用计数的,而原始数据类型的操作方式和OC类型是不同的(不需要retain)。个人认为cocoa设计时为了效率(不需要判断加入容器中的元素的类型),也为了抽象的一致性(即引用计数操作),而没有允许NSArray中存储指针意外原始数据类型。
NSNumber * number = [NSNumber numberWithInt:2];
NSArray * array = [NSArray arrayWithObject:@“0ne”,number,nil]
使用快捷创建
NSArray * array = @[@“one”];//结尾不能写nil了
使用下标取出元素
NSString * str = array[0];
使用普通循环方式取出数据
for(int i = 0;i < array.count;i++){id obj = array[i];
NSLog(@“%@”,obj);}
增强for循环:如果需要记录当前循环到的次数,就使用普通for循环,如果只关心取出的值,就可以使用增强for循环。
数组中是否可以存储不同的数据类型:可以,但是不建议存储不同的数据类型,因为在循环中可能要调用某个元素的方法,如果类型不统一可能造成程序出现不可预知的错误
使用迭代器取出所有值
NSEnumerator * enumerator = [array objectEnubmerator];
id obj;
while(obj = [enumberator nextObject]){NSLog(@“%@”,obj);}
快速取出数组中第一个或者最后一个元素
id obj = [array firstObject/lastObject];
判断数组中是否包含某一对象
BOOL result = [array containsObject:str];
数组中存储的是什么?
数组中存储的只不过是对象的指针地址,只要是对象都可以存储到数组中
数组中可以重复的存储对象,并且数组中是按照自然顺序进行存储的,添加的时候是什么顺序就按照什么顺序进行存储
排序
NSSortDescriptor给自定义对象进行排序
NSSortDescriptor * array = [NSSortDescriptor sortDescriptorWithKey:@“age”,NSSortDescriptor:YES];//YES表示升序,NO表示降序
15.2 可变长数组
//创建空数组
NSMutalbleArray * mArray = [NSMutableArray array];
//添加对象
[mArray addObject:@“one”];
[mArray addObject:@(2)];
//在某一索引位置插入
[mArray insertObject:@“one” atIndex:1];
删除最后一个对象
[mArray removeLastObject];
//删除所有数据
[mArray removeAllObjects];
//删除具体对象
[mArray removeObject:@“one”];
//把不可变长数组内容存储到可变长数组中
[mArray addObjectsFromArray:@“array”];
/*---------------------NSArray---------------------------*/
//创建数组
NSArray *array1 = [NSArray arrayWithObject:@"1"];
NSArray *array2 = [NSArray arrayWithObjects:@"1",@"2",@"3", nil];
NSArray *array3 = [NSArray arrayWithArray:array2];
NSLog(@"array1 = %@",array1);
NSLog(@"array2 = %@",array2);
NSLog(@"array3 = %@",array3);
//获取数组内数据个数
int count = [array2 count];
NSLog(@"array2 size is %d",count);
//访问数组内的数据
NSString *str1 = [array2 objectAtIndex:0];
NSLog(@"array2 first content is %@",str1);
//数组中插入数据 返回新的数组
NSArray *array4 = [array3 arrayByAddingObject:@"4"];
NSLog(@"array4 = %@",array4);
//数组内的数据以制定字符连接
NSString *str2 = [array4 componentsJoinedByString:@","];
NSLog(@"str2 = %@",str2);
//判断数组中是否包含某对象
BOOL b1 = [array4 containsObject:@"4"];
BOOL b2 = [array4 containsObject:@"5"];
NSLog(@"b1 = %d,b2 = %d",b1,b2);
//取数组内制定对象的索引
int index = [array4 indexOfObject:@"4"];
NSLog(@"index = %d",index);
NSString *str3 = [array4 lastObject];
NSLog(@"array4 last object is %@",str3);
/*-----------------------可变数组NSMutableArray-----------------------------------------*/
//初始化数组 指定数组长度 但可变
NSMutableArray *mArray1 = [NSMutableArray arrayWithCapacity:5];
//向数组中添加元素
[mArray1 addObject:@"aaaa"];
[mArray1 addObject:@"cccc"];
NSLog(@"mArray1 = %@",mArray1);
//向指定位置插入元素
[mArray1 insertObject:@"bbbb" atIndex:1];
[mArray1 insertObject:@"dddd" atIndex:[mArray1 count]];
[mArray1 insertObject:@"eeee" atIndex:[mArray1 count]];
NSLog(@"mArray1 = %@",mArray1);
//移除元素
[mArray1 removeObject:@"eeee"];
NSLog(@"mArray1 = %@",mArray1);
[mArray1 removeObjectAtIndex:[mArray1 count]-1];
NSLog(@"mArray1 = %@",mArray1);
NSArray *array5 = [NSArray arrayWithObjects:@"bbbb",@"cccc", nil];
[mArray1 removeObjectsInArray:array5];
NSLog(@"mArray1 = %@",mArray1);
//向数组内插入数组
NSMutableArray *mArray2 = [NSMutableArray arrayWithObjects:@"aaaa",@"aaaa", nil];
[mArray2 addObject:@"bbbb"];
NSLog(@"mArray2 = %@",mArray2);
[mArray2 addObjectsFromArray:array4];
NSLog(@"mArray2 = %@",mArray2);
//替换元素
[mArray2 replaceObjectAtIndex:[mArray2 count]-1 withObject:@"5"];
NSLog(@"mArray2 = %@",mArray2);
//遍历数组 常规方法:性能较低
NSArray *array6 = [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",@"e", nil];
int len = [array6 count];
for (int i=0; i<len; i++) {
NSString *value = [array6 objectAtIndex:i];
NSLog(@"array6 %d content is %@",i,value);
}
//枚举遍历 相当于java中的增强for循环
for (NSString *string in array6) {
NSLog(@"array6 content is %@",string);
}
NSLog(@"-----------------------");
//当不确定数组元素类型时
for(id string in array6){
NSLog(@"array6 content is %@",string);
}
协议作用
解决类耦合关系,,,提高程序的可维护性,,,封装变化点
协议的命名规范;1。协议与哪个类相关就使用该类的名字为开头,后面接上delegate
2协议中的方法一定要与相关类的类名进行开头,协议方法的第一个参数永远应该是类自己
//越过消息机制,直接去执行一个方法
SEL runSel = @selector(run);
[p performSelector:runSel];
//只用Sel的方式执行有参数传递的方法
BOOL restul = [p performSelector:@selector(runWithTime:) withObject:@"跑一天"];
if(restul)
{
NSLog(@"跑成功了");
}
*/
不可变字典,可变字典
不可变集合,可变集合(不允许重复)
集合set
分类:不可以在分类中声明成员变量
在分类中可以毫无限制的使用原类中的成员变量,作用域和 原类相同
在分类中可以使用self访问原类中的方法
可以在分类中调用原类的父类的方法
注意:分类和原类是相同的
如果分类中重写了原类中的方法实现,那么使得原类中的方法被覆盖。
一定要注意不要在多个分类中
在分类中使用@property只能够生成set和get方法的声明,但是没有自己生成实现
在分类中不能够自动生成成员变量,所以不能生成get和set方法具体实现
如果真的要通过get和set方法存储一个值那么要在原类中声明成员变量
//把分类集成到原类的文件中,一起声明,并且在原类的.m文件中一起实现
//把原类的功能
扩展应用在类的.m文件中声明一个扩展(特殊的分类)中只有文件的声明,在原类中实现扩展中声明的方法
在扩展中声明的方法,在原类的.m文件中可以随意的访问,但是相当于私有方法
不可变字典NSDictionary * dict = @{@“k1”:@“one”,…};
//删除一个指定的key removeObjectForKey
//同时删除多条数据 removeObjectForKeys
//操作不存在的key并不会报错
//如果取出的值数据类型和我们定义的变量没有对应上,编译器 并不会直接报错,只有真正的使用变量操作的时候才会报错,,如果出现类似的问题,应该通过打印真实的类型来处理
//集合最大的用途在于取出重复的数据
原文:http://www.cnblogs.com/starainDou/p/5018039.html