首页 > 其他 > 详细

OC_day3_总结

时间:2015-12-04 01:00:15      阅读:414      评论:0      收藏:0      [点我收藏+]

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并不会报错

 

//如果取出的值数据类型和我们定义的变量没有对应上,编译器 并不会直接报错,只有真正的使用变量操作的时候才会报错,,如果出现类似的问题,应该通过打印真实的类型来处理

 

//集合最大的用途在于取出重复的数据

OC_day3_总结

原文:http://www.cnblogs.com/starainDou/p/5018039.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!