• ios9基础知识总结(一)


    I--load

    类被加载时自动调用,只要类的项目中,运行时就会加载。类一加载,此方法就会调用

    //类被加载时调用,只要类的项目中,运行时就会加载,类一加载,此方法就调用

    + (void)load

    {

        NSLog(@"load方法被调用");

    }

    //当使用这个类第一次创建对象时,或第一次调用类方法时,需要初始化一下这个类,该方法会被调用

    load   initialize  只有类实例化的第一次的时候才能被调用  以后都不调用

    +initialize   

    当使用这个类第一次创建对象时,需要初始化一下这个类,该方法会被调用。实际开发中,经常再次方法中初始化一些static的全局变量。第一次使用这个类是自动调用。第一次创建对象;第一次使用类方法

    //当使用这个类第一次创建对象时,或第一次调用类方法时,需要初始化一下这个类,该方法会被调用

    + (void)initialize

    {

        NSLog(@"initialize方法被调用");

        //实际开发中,经常在此方法中初始化一些static的全局变量

        currentMusic = @"Lemon Tree";

    }

    -copy

    返回一个复制的新对象。会调用对象的copyWithZone方法。需要对象的类型遵守NSCopying协议

        

    // copy代表set方法会release旧对象、copy新对象

    // 修改外面的变量,并不会影响到内部的成员变量

    // 建议:NSString一般用copy策略,其他对象一般用retain

    #pragma mark copying协议的方法

    // 这里创建的副本对象不要求释放

    则需要重写父类的copying方法

    - (id)copyWithZone:(NSZone *)zone {

        Student *copy = [[[self class] allocWithZone:zone] init];

        

        // 拷贝名字给副本对象

        copy.name = self.name;

        

        return copy;

    }

    只有一种情况是浅拷贝  不可变对象调用copy方法时 是浅拷贝

    总结 对于copy的方法  对于不可变的对象都是浅拷贝  既指针复制   不可变的对象有 NSString、NSArray  而mutableCopy都是alloc一个新对象出来 并返回  对于可变的对象mutableCopy、copy都是深拷贝  alloc新的对象并返回  可变的对象有 NSMutableString、NSMutableArray

    不论是可变还是不可变 copy返回的对象都是不可变的  mutablecopy返回的对象都是可变的

    容器类对象不论是可变还是不可变 copy mutablecopy返回的对象都是和之前一样的  都是浅拷贝

    浅拷贝:指针拷贝  不会产生新的对象 原对象计数器的指针+1

    -mutableCopy    

    返回一个赋值的新对象。会调用对象的mutableCopyWithZone:方法。需要对象的类型遵守mutableCopyWithZone:协议。返回的是可变对象

    #pragma mark 可变字符串 mutableString的copy (深拷贝)

    void mutableStringCopy()

    {

        NSMutableString *string = [NSMutableString stringWithFormat:@"余大强的年龄是%i",0];

        //会产生一个新的对象 str的计数器为1

        NSString *str = [string copy];

        //copy 返回的都是不可变的字符串NSString

        [str release];

    }

    //copy语法的目的:改变副本的时候不会影响到原对象

    #pragma mark 演示字符串string的拷贝mutablecopy(深拷贝)

    void stringMutableCopy()

    {

        NSString *string = [[NSString alloc]initWithFormat:@"余大强的 age = %zi",22];

        

        NSMutableString *str = [string mutableCopy];

        //mutableCopy返回的对象都是可变的对象NSMutableString

        NSLog(@"str:%zi", [str retainCount]);

        NSLog(@"string:%zi", [string retainCount]);

        NSLog(@"%@",string);

        //    str和string不是相同对象

        //    NSLog(@"%i", str == string);

        //    NSLog(@"%zi",&string);

        //    NSLog(@"%zi",&str);

        

        //    appendString在字符串的尾部追加字符串

        //字符串的追加 append  一种是按照格式的追加  一种是直接加字符串

        [str appendFormat: @"%d",22];

        [str appendString:@" abcd"];

        NSLog(@"str:%@", str);

        

        [str release];

        [string release];

    }

    +class 

    返回一个类的类对象 ,Class o =[TRExample class];不加*

    +superClass  

    返回父类的类对象

    +isSubclass

    [TRExample isSubclassOfClass:[NSObject class]];判断一个类型是否是另一个类型的 子类

      if ([TRExample isSubclassOfClass:[NSObject class]]) 

        {

            NSLog(@"是子类");

         }

    实际中常用的是:[e isKindOfClass:[TRExample class]];

    — isKindOfClass  判断是否是同类型(一般指的是类的类型是否一致)

         if([obj isKindOfClass:o])

    //实际开发中的写法if([e isKindOfClass:[TRExample class]])

           {

               NSLog(@"obj引用指向的对象是TRExample类型");

           }

          else

           {

                 NSLog(@"obj指向的对象不是我们需要的类型");

           }

    ////判断引用指向的对象是否是这种类型或这个类的子类型

        if([person isKindOfClass:[NSObject class]]){

            NSLog(@"person指向的对象是NSObject类型");

        }

        if([person isKindOfClass:[TRPerson class]]){

            NSLog(@"person指向的对象是TRPerson类型");

        }

    instancesRespondToSelector: 判断类的方法中是否有某方法 

       void test3()

    {   //方法选择器对象,代表show方法

        SEL sel = @selector(show);

        BOOL res = [TRExample instancesRespondToSelector:sel];

    //实际开发中的写法[TRExample instancesRespondToSelector:@selector(show)];

        if(res)

        {

            NSLog(@"TRExample类中有实例方法show");

        }

        else

        {

            NSLog(@"TRExample类中没有实例方法show");

        }

    }

    - respondsToSelector  询问引用指向的对象是否响应show方法

       if([obj respondsToSelector:@selector(show)])

        {

            NSLog(@"obj指向的对象会响应show方法");

            [obj show];

        }

    4.+ conformsToProtocol  判断一个类是否遵守指定的协议

        void test4()

    {

        Protocol *p = @protocol(NSCopying);

    //实际开发中的写法 if([TRExample conformsToProtocol:@protocol(NSCopying)]);

        if([TRExample conformsToProtocol:p])

        {

            NSLog(@"类TRExample遵守NSCopying协议");

        }

        else

        {

            NSLog(@"类TRExample没有遵守NSCopying协议");

        }

    }

    以上方法在实际开发中的写法 //实际开发中的写法

      void test5()

      {

        TRExample *e = [TRExample new];

        [e isKindOfClass:[TRExample class]];

        [TRExample instancesRespondToSelector:@selector(show)];

        [TRExample conformsToProtocol:@protocol(NSCopying)];

    }

    5.- performSelector 方法的调用

       

       void test6()

      {

        id obj = [TRExample new];

        //调用show方法

        [obj show];

        //调用show方法

        [obj performSelector:@selector(show) withObject:nil];

      }

    +conformsToProtocol:

    Protocol *p=@protocol(NSCopying);加*

    BOOL b=[TRExample conformsToProtocol:p];

    判断是否遵守协议

    实际中:

    [TRExample conformsToProtocol:@protocol(NSCopying)];

    - isEqual 判断两个对象是否相等(包含属性)

       TRPerson *person = [TRPerson new];

        person.ID = @"1234567890";

        person.name = @"Daniel";

        person.age = 30;

        Class c = [person class];

        Class c2 = [TRPerson class];

        TRPerson *person2 = [[TRPerson alloc]init];

        person2.ID = @"1234567890";

        person2.name = @"Daniel";

        person2.age = 30;

        if([person isEqual:person2]){ // ==

            NSLog(@"两个对象是相等的");

        }else{

            NSLog(@"两个对象是不相等的");

        }

        

        //比较两个引用是否指向了同一个对象

        if(person == person2){

            NSLog(@"两个引用指向了同一个对象");

        }else{

            NSLog(@"两个引用指向了不同的对象");

        }

    }

       两个引用指向的对象是否相等有两层含义:

      1) 两个引用是否指向了同一个对象

      2) 两个引用指向的对象内容(属性)是否相等。

       如果需要比较两个引用是否指向了同一个对象,只要使用"=="号就可以判断了。

       但如果需要比较两个引用指向的对象的内容(属性)是否相等,就得调用isEqual:方法来比较了。

      isEqual 方法的重构与调用

      - (BOOL)isEqual:(id)object

    {

        //判断是否是自己

        if (self == object) return YES;

        //判空

        if (!object) return NO;

        //是否是同类

        if(![object isKindOfClass:[TRPerson class]]) return NO;

        //如果是同类,做类型转换,再进行比较

        TRPerson *person = object;

        return  [self.ID isEqual:person.ID] &&

                [self.name isEqual:person.name] &&

                self.age == person.age;

    }

    8.总结

    + alloc   分配内存空间

    - init   初始化这片内存空间

    + load    类加载时自动调用, 

    程序运行时,所有类加载

    + initialize  第一次使用这个类时自动调用

    第一次创建对象

    第一次调用类方法

    - copy 返回一个复制的新对象

    会调用对象的copyWithZone:方法。需要对象的类型遵守NSCopying协议

    返回的可能是不可变对象

    - mutableCopy 返回一个复制的新对象

    会调用对象的mutableCopyWithZone:方法。需要对象的类型遵守NSMutableCopying协议

    返回的是可变对象

    + class

    返回这个类的类对象

    + superclass

    返回父类的类对象

    + isSubclassOfClass

    判断一个类型是否是另一个类型的子类

    + instancesRespondToSelector:

    判断这个类型的对象是否会响应指定的方法

    - performSelector:withObject:

    另一种调用对象方法的方式

    2.4 方法选择器Selector

    是一种特殊的对象,代表一个方法。

    这种对象的类型是SEL,如何创建这种对象:

    SEL sel = @selector(方法名);//不加*

    比如:

    @selector(initWithName:age:gender:salary:)

    @selector(setName:)

    //方法选择器Selector

    void test3()

    {   //方法选择器对象,代表show方法

        SEL sel = @selector(show);

        BOOL res = [TRExample instancesRespondToSelector:sel];

        if(res)

        {

            NSLog(@"TRExample类中有实例方法show");

        }

        else

        {

            NSLog(@"TRExample类中没有实例方法show");

        }

    }

    9. - initWithCString           将C风格的字符串转换成OC风格的字符串对象

       

        char str[] = "Hai,Hello";

        NSString *str3 = [[NSString alloc]initWithCString:str encoding:NSUTF8StringEncoding];

    10.cStringUsingEncoding        将OC风格的字符串对象转换成C风格的字符串

        const char *cstr = [str3 cStringUsingEncoding:NSUTF8StringEncoding];

        NSLog(@"cstr=%s", cstr);

        NSString *str4 = [[NSString alloc]initWithFormat:@"%02d:%02d:%02d", 8, 5, 9];

        NSLog(@"%@", str4);

        NSString *str5 = [NSString stringWithFormat:@"%02d:%02d:%02d", 8, 5, 9];

        NSLog(@"%@", str5);

    11.stringWithContentsOfFile    从文件中读取内容到字符串对象

     NSString *str6 = [NSString stringWithContentsOfFile:@"/Users/Daniel/Desktop/a.txt" encoding:NSUTF8StringEncoding error:nil];

    NSLog(@"str6:%@", str6);

    12.writeToFile                 将字符串中的内容写到一个文件中

    [str6 writeToFile:@"/Users/Daniel/Desktop/b.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];

    }

    13.stringByAppendingString   合并,拼接字符串

        NSString *str5 = @"ABC";

        NSString *str6 = @"DEF";

        NSString *str7 = [str5 stringByAppendingString:str6];

        NSLog(@"str7:%@", str7);

        str5 = [str5 stringByAppendingFormat:@"%02d:%02d:%02d",2,3,4];

        NSLog(@"str5=%@", str5);

        

    }

    14.characterAtIndex            获取指定位置的字符

        NSString *str4 = @"ABCDEFG";

        char ch = [str4 characterAtIndex:0];

        NSLog(@"%c", ch);

    15.lengthOfBytesUsingEncoding  求字符串的长度

        NSString *str2 = @"我们都是,好孩子";

        NSLog(@"length:%ld", str2.length);

        NSLog(@"lengthOfBytes:%ld", [str2 lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);

    16.componentsSeparatedByString  字符串分解方法

        NSString *info = @"Daniel:30:1:123456.78";

        NSArray *array = [info componentsSeparatedByString:@":"];

        NSLog(@"array[0]=%@", array[0]);

        NSLog(@"array[1]=%@", array[1]);

        NSLog(@"array[2]=%@", array[2]);

        NSString *str = @"ABCDEFGHIJKLMN";

        //包括起始位置

        NSString *str2 = [str substringFromIndex:8];

        NSLog(@"str2=%@", str2);

        //不包括结束位置

        NSString *str3 = [str substringToIndex:8];

        NSLog(@"str3=%@", str3);

        NSRange r = NSMakeRange(2, 4);

        NSString *str4 = [str substringWithRange:r];

        NSLog(@"str4=%@", str4);

    17.rangeOfString  查找子串

         默认是大小写敏感

        NSString *str = @"Hello World.";

        NSRange r = [str rangeOfString:@"LLO"];

        if (r.location == NSNotFound) {

            NSLog(@"没有找着指定的子串");

        }else{

            NSLog(@"找着了,在%ld位置", r.location);

        }

        //忽略大小写查找子串

        r = [str rangeOfString:@"LLO" options:NSCaseInsensitiveSearch];

        if (r.length == 0){

            NSLog(@"没找到指定的字符子串");

        }else{

            NSLog(@"找着了,在%ld位置", r.location);

        }

    18.stringByReplacingOccurrencesOfString  替换子串

             NSString *str = @"TRHelloWorld.mm";

        str = [str stringByReplacingOccurrencesOfString:@".mm" withString:@".java"];

        NSLog(@"str:%@", str);

        str = [str stringByReplacingCharactersInRange:NSMakeRange(2, 3) withString:@"HELLO"];

        NSLog(@"str:%@", str);

    19.NSComparisonResult  比较大小

        NSString *str1 = @"aab";

        NSString *str2 = @"abc";

        NSComparisonResult result = [str1 compare:str2];

        if (result == NSOrderedAscending) {

            NSLog(@"str1 < str2");

        }else if(result == NSOrderedDescending){

            NSLog(@"str1 > str2");

        }else {

            NSLog(@"str1 == str2");

        }

        

        str1 = @"abc";

        str2 = @"ABC";

        if([str1 compare:str2 options:NSCaseInsensitiveSearch] == NSOrderedSame){

            NSLog(@"忽略大小写,两个字符串内容相同");

        }

        

        str1 = @"A10.txt";

        str2 = @"A8.txt";

        result = [str1 compare:str2 options:NSNumericSearch];//A10.txt > A8.txt

        NSLog(@"result:%ld", result);

    20.isEqualToString  比较内容是否相等

      

       NSString *str1 = @"ABC";

        NSString *str2 = @"ABC";

        if(str1 == str2){

            NSLog(@"str1和str2==");

        }

        NSString *str3 = [[NSString alloc]initWithFormat:@"%@", @"ABC"];

        if(str1 == str3){

            NSLog(@"str1和str3也==");

        }

        //NSString类中的isEqual:方法比较的是内容,但是,在实际开发中,对于字符串类,基本不会使用此方法去比较内容是否相等,一般用isEqualToString:

        if([str1 isEqual:str3]){

            NSLog(@"str1和str3内容相等");

        }

        //专门给字符串类定制的比较方法

        if([str1 isEqualToString:str3]){

            NSLog(@"str1和str3的内容肯定是相同的");

        }

        

        //判断是否是指定字符串开始或结束

        NSString *filename = @"HelloWorld.mm";

        if([filename hasPrefix:@"Hello"]){

            NSLog(@"文件名以Hello开始");

        }

        if([filename hasSuffix:@".mm"]) {

            NSLog(@"这个文件是Objective C++源文件");

        }

    20.改变大小写

      void test9()

      {

          NSString *str = @"Hello World.";

          str = [str lowercaseString];

         NSLog(@"str:%@", str);

         str = [str capitalizedString];

         NSLog(@"str:%@", str);

     }

    21.将字符串转换成其他基本类型

    void test10()

    {

        NSString *str1 = @"123";

        int i1 = [str1 intValue];

        NSLog(@"i1=%d", i1);

        NSInteger i2 = [str1 integerValue];

        NSLog(@"i2=%ld", i2);

        NSString *str2 = @"3.1415926";

        float f = [str2 floatValue];

        NSLog(@"f=%f", f);

    }

    22.可变的字符串

        void test1()

      {

          NSMutableString *str = [NSMutableString stringWithCapacity:1];

          [str appendString:@"ABCDEFG"];

          NSLog(@"str:%@", str);

      }

    23.stringFromDate   进行格式化(将日期转成字符串)

        void test2()

      {

        //1.要处理的日期对象

        NSDate *date = [NSDate date];

        //2.准备格式对象

        NSDateFormatter *formatter = [[NSDateFormatter alloc]init];

        //3. 设置格式串属性

        formatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";

        //4. 进行格式化(将日期转成字符串)

        NSString *formatString = [formatter stringFromDate:date];

        NSLog(@"%@", formatString);

        

        //将字符串转成日期

        NSString *dateString = @"2016-01-01 02:03:04";

        NSDate *date2 = [formatter dateFromString:dateString];

        NSLog(@"%@", date2);

     }

    24.//

    //  main.m

    //  Demo2_NSArray

    //

    //  Created by DanielGuo on 15/8/27.

    //  Copyright (c) 2015年 Tarena. All rights reserved.

    //

    #import <Foundation/Foundation.h>

    //创建数组NSArray对象

    void test1()

    {

        //1. 字面值方式

        NSArray *arr1 = @[@"aaa", @"bbb", @"ccc"];

        //2. 工厂方法创建,最后一人元素必须是nil

        NSArray *arr2 = [NSArray arrayWithObjects:@"aaa", @"bbb", @"ccc", @"ddd", nil];

        NSString *strs[4] = {@"aaa", @"bbb", @"ccc", @"ddd"};

        NSArray *arr3 = [NSArray arrayWithObjects:strs count:4];

        NSLog(@"%@,%@,%@", arr1, arr2, arr3);

    }

    //遍历数组

    void test2()

    {

        //数组中只能放对象(对象的引用),不能放非对象类型(C语言中的基本类型,结构体等),数组中的每个元素是id类型的引用

        NSArray *arr = @[@"aaa", @"bbb", @"ccc", @"ddd"];

        NSLog(@"0000%@", arr);

        //1. 使用数组下标的方式进行遍历

        for(int i=0; i<arr.count; i++){

            NSString *str = arr[i];

            NSLog(@"%@", str);

            if(i == 2)break;

        }

        //2. 使用forin loop循环的方式进行遍历

        for(NSString *str in arr){

            NSLog(@"%@", str);

            //if (不需要遍历了)break;

        }

        //3. 使用Block进行遍历

        [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

            NSLog(@"下标为%lu的元素是%@", idx, obj);

            if(idx == 2)*stop = YES;

        }];

        //4. 使用迭代器来遍历

        NSEnumerator *enumerator = [arr objectEnumerator];//获取迭代器

        NSString *obj = nil;

        while(obj = [enumerator nextObject]){ //通过迭代器拿数组中的一个对象

            NSLog(@"%@", obj);//对获得的对象进行处理

        }

    }

    //数组的拷贝

    void test3()

    {

        NSArray *arr1 = @[@"aaa", @"bbb", @"ccc"];

        NSArray *arr2 = arr1;

        //arr1[0] = @"AAA";//不可变,改不了

        //浅拷贝

        NSArray *arr3 = [[NSArray alloc]initWithArray:arr1 copyItems:NO];

        //深拷贝

        NSArray *arr4 = [[NSArray alloc]initWithArray:arr1 copyItems:YES];

        

    }

    //测试浅拷贝和深拷贝的区别

    #import "TRPerson.h"

    void test4()

    {

        TRPerson *p1 = [[TRPerson alloc]initWithName:@"张三" andAge:30];

        TRPerson *p2 = [[TRPerson alloc]initWithName:@"李四" andAge:23];

        TRPerson *p3 = [[TRPerson alloc]initWithName:@"王小二" andAge:19];

        NSArray *persons = @[p1, p2, p3];

        //浅拷贝

        NSArray *persons2 = [[NSArray alloc]initWithArray:persons copyItems:NO];

        if(persons[0] == persons2[0]){

            NSLog(@"这是同一个对象");

        }

        [persons[0] setAge:35];//persons[0].age = 35;

        NSLog(@"%ld", [persons2[0] age]);

        

        //深拷贝

        NSArray *persons3 = [[NSArray alloc]initWithArray:persons copyItems:YES];

        for (TRPerson *p in persons) {

            NSLog(@"%p", p);

        }

        NSLog(@"===============");

        for (TRPerson *p in persons2) {

            NSLog(@"%p", p);

        }

        NSLog(@"===============");

        for (TRPerson *p in persons3) {

            NSLog(@"%p", p);

        }

    }

    //常用方法

    void test5()

    {

        NSArray *arr = @[@"aaa", @"bbb", @"ccc", @"ddd"];

        NSString *str = [[NSString alloc]initWithFormat:@"%@",@"bbb"];

        NSLog(@"arr[1]:%p,str:%p", arr[1], str);

        NSLog(@"%@", str);

        //判断数组中是否包含指定的对象,通过isEqual方法来判断的,而不是地址

        if([arr containsObject:str]){

            NSLog(@"数组中有这个对象");

        }

        

        TRPerson *p1 = [[TRPerson alloc]initWithName:@"张三" andAge:30];

        TRPerson *p2 = [[TRPerson alloc]initWithName:@"李四" andAge:23];

        TRPerson *p3 = [[TRPerson alloc]initWithName:@"王小二" andAge:19];

        NSArray *persons = @[p1, p2, p3];

        TRPerson *p4 = [[TRPerson alloc]initWithName:@"王小二" andAge:19];

        //当调用[p3 isEqual:p4]时结果为YES,说明数组中有王小二这个人

        if ([persons containsObject:p4]) {

            NSLog(@"数组中有王小二");

        }

        NSLog(@"==============");

        //从数组中查找对象,返回其下标,比较的是内容(isEqual:)

        NSInteger index = [persons indexOfObject:p4];

        if (index == NSNotFound) {

            NSLog(@"没有王小二");

        }else{

            NSLog(@"王小二在下标%ld的位置", index);

        }

        NSLog(@"==============");

        //下面方法比较的是地址(没有使用isEqual:方法)

        index = [persons indexOfObjectIdenticalTo:p3];

        if (index == NSNotFound) {

            NSLog(@"数组中没有这个对象");

        }else{

            NSLog(@"对象的下标是:%ld", index);

        }

        

        //向数组中的每一个对象发消息

        [persons makeObjectsPerformSelector:@selector(show)];

        //相当于以下代码

        /*

        for (TRPerson *p in persons) {

            [p show];

        }

         */

    }

    //其他方法

    void test6()

    {

        NSArray *arr = @[@"aaa", @"bbb", @"ccc", @"ddd"];

        arr = [arr arrayByAddingObject:@"eee"];

        NSLog(@"%@", arr);

    }

    //数组排序

    NSInteger sortRule(id obj1, id obj2, void *p)

    {

        //NSLog(@"sortRule");

        NSString *str1 = obj1;

        NSString *str2 = obj2;

        return [str1 compare:str2];

    }

    void test7()

    {

        NSArray *arr = @[@"aaa",  @"ccc", @"bbb", @"ccc"];

        NSArray *sortedArr = [arr sortedArrayUsingFunction:sortRule context:nil];

        NSLog(@"%@", sortedArr);

        

        arr = @[@"aaa",  @"ccc", @"bbb", @"ccc"];

        //调用字符串类中的compare:方法进行比较大小运算

        sortedArr = [arr sortedArrayUsingSelector:@selector(compare:)];

        NSLog(@"%@", sortedArr);

    }

    int main(int argc, const char * argv[]) {

        @autoreleasepool {

            test5();

        }

        return 0;

    }

    NSString *str3 = [[NSString alloc]initWithCString:str encoding:NSUTF8StringEncoding];

    将C风格的字符串转换成OC风格的字符串对象

    //将OC风格的字符串对象转换成C风格的字符串

    const char *cstr = [str3 cStringUsingEncoding : NSUTF8StringEncoding];

    将字符串按要求格式初始化

    NSString *str4 =[[NSString alloc]initWithFormat:@"%02d:%02d:%02d", 8, 5, 9];

    将字符串按要求格式输出

    NSString *str5 = [NSString stringWithFormat:@"%02d:%02d:%02d", 8, 5, 9];

    从文件中读取内容到字符串对象

    NSString *str6 = [NSString stringWithContentsOfFile:

    @"/Users/Daniel/Desktop/a.txt" encoding:NSUTF8StringEncoding error:nil];

    将字符串中的内容写到一个文件中

    [str6 writeToFile:@"/Users/Daniel/Desktop/b.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];

    在Unicode编码中,一个汉字是一个字符,有几个汉字,长度就是几

    NSString *str2 = @"我们都是,好孩子";

    NSLog(@"length:%ld", str2.length);

    获取指定位置的字符

     NSString *str4 = @"ABCDEFG";

     char ch = [str4 characterAtIndex:0];

    合并,拼接字符串

    NSString *str5 = @"ABC";

    NSString *str6 = @"DEF";

    NSString *str7 = [str5 stringByAppendingString:str6];

    字符串分解方法

    NSString *info = @"Daniel:30:1:123456.78";

    NSArray *array=[info componentsSeparatedByString:@“:”];

    //测试字符串对象

    void test1()

    {

        //改变引用变量的值,没有改变对象的内容

        NSString *str = @"Hello";

        str = @"World";

        NSLog(@"str=%@", str);

        //字符串池的存在

        NSString *str1 = @"ABCDEF";

        NSString *str2 = @"ABCDEF";

        NSLog(@"str1=%p,str2=%p", str1, str2);

        if(str1 == str2){

            NSLog(@"str1==str2");

        }

        str2 = @"DEF";

    }

    //创建和初始化字符串对象

    void test2()

    {

        NSString *str1 = @"Hello";

        NSString *str2 = [[NSString alloc]initWithString:str1];//@"World";

        //将C风格的字符串转换成OC风格的字符串对象

        char str[] = "Hai,Hello";

        NSString *str3 = [[NSString alloc]initWithCString:str encoding:NSUTF8StringEncoding];

        //将OC风格的字符串对象转换成C风格的字符串

        const char *cstr = [str3 cStringUsingEncoding:NSUTF8StringEncoding];

        NSLog(@"cstr=%s", cstr);

        NSString *str4 = [[NSString alloc]initWithFormat:@"%02d:%02d:%02d", 8, 5, 9];

        NSLog(@"%@", str4);

        NSString *str5 = [NSString stringWithFormat:@"%02d:%02d:%02d", 8, 5, 9];

         NSLog(@"%@", str5);

        

        //从文件中读取内容到字符串对象

        NSString *str6 = [NSString stringWithContentsOfFile:@"/Users/Daniel/Desktop/a.txt" encoding:NSUTF8StringEncoding error:nil];

        NSLog(@"str6:%@", str6);

        //将字符串中的内容写到一个文件中

        [str6 writeToFile:@"/Users/Daniel/Desktop/b.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];

    }

    //字符串的普通方法

    void test3()

    {

        const char *str1 = "我们";//E68891

        //NSLog(@"%X%X%X", *str1, *(str1+1), *(str1+2));

        NSLog(@"strlen(str1)=%ld", strlen(str1));

        //在Unicode编码中,一个汉字是一个字符,有几个汉字,长度就是几

        NSString *str2 = @"我们都是,好孩子";

        NSLog(@"length:%ld", str2.length);

        NSLog(@"lengthOfBytes:%ld", [str2 lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);

        

        NSString *str3 = @"Hello World!";

        NSLog(@"length:%ld", str3.length);

        

        //获取指定位置的字符

        NSString *str4 = @"ABCDEFG";

        char ch = [str4 characterAtIndex:0];

        NSLog(@"%c", ch);

        

        //合并,拼接字符串

        NSString *str5 = @"ABC";

        NSString *str6 = @"DEF";

        NSString *str7 = [str5 stringByAppendingString:str6];

        NSLog(@"str7:%@", str7);

        str5 = [str5 stringByAppendingFormat:@"%02d:%02d:%02d",2,3,4];

        NSLog(@"str5=%@", str5);

        

    }

    //字符串分解方法

    void test4()

    {

        NSString *info = @"Daniel:30:1:123456.78";

        NSArray *array = [info componentsSeparatedByString:@":"];

        NSLog(@"array[0]=%@", array[0]);

        NSLog(@"array[1]=%@", array[1]);

        NSLog(@"array[2]=%@", array[2]);

        NSString *str = @"ABCDEFGHIJKLMN";

        //包括起始位置

        NSString *str2 = [str substringFromIndex:8];

        NSLog(@"str2=%@", str2);

        //不包括结束位置

        NSString *str3 = [str substringToIndex:8];

        NSLog(@"str3=%@", str3);

        NSRange r = NSMakeRange(2, 4);

        NSString *str4 = [str substringWithRange:r];

        NSLog(@"str4=%@", str4);

    }

    //查找子串

    void test5()

    {

        //默认是大小写敏感

        NSString *str = @"Hello World.";

        NSRange r = [str rangeOfString:@"LLO"];

        if (r.location == NSNotFound) {

            NSLog(@"没有找着指定的子串");

        }else{

            NSLog(@"找着了,在%ld位置", r.location);

        }

        //忽略大小写查找子串

        r = [str rangeOfString:@"LLO" options:NSCaseInsensitiveSearch];

        if (r.length == 0){

            NSLog(@"没找到指定的字符子串");

        }else{

            NSLog(@"找着了,在%ld位置", r.location);

        }

    }

    //替换子串

    void test6()

    {

        NSString *str = @"TRHelloWorld.mm";

        str = [str stringByReplacingOccurrencesOfString:@".mm" withString:@".java"];

        NSLog(@"str:%@", str);

        str = [str stringByReplacingCharactersInRange:NSMakeRange(2, 3) withString:@"HELLO"];

        NSLog(@"str:%@", str);

    }

    //比较大小

    void test7()

    {

        NSString *str1 = @"aab";

        NSString *str2 = @"abc";

        NSComparisonResult result = [str1 compare:str2];

        if (result == NSOrderedAscending) {

            NSLog(@"str1 < str2");

        }else if(result == NSOrderedDescending){

            NSLog(@"str1 > str2");

        }else {

            NSLog(@"str1 == str2");

        }

        

        str1 = @"abc";

        str2 = @"ABC";

        if([str1 compare:str2 options:NSCaseInsensitiveSearch] == NSOrderedSame){

            NSLog(@"忽略大小写,两个字符串内容相同");

        }

        

        str1 = @"A10.txt";

        str2 = @"A8.txt";

        result = [str1 compare:str2 options:NSNumericSearch];//A10.txt > A8.txt

        NSLog(@"result:%ld", result);

    }

    //判等

    void test8()

    {

        NSString *str1 = @"ABC";

        NSString *str2 = @"ABC";

        if(str1 == str2){

            NSLog(@"str1和str2==");

        }

        NSString *str3 = [[NSString alloc]initWithFormat:@"%@", @"ABC"];

        if(str1 == str3){

            NSLog(@"str1和str3也==");

        }

        //NSString类中的isEqual:方法比较的是内容,但是,在实际开发中,对于字符串类,基本不会使用此方法去比较内容是否相等,一般用isEqualToString:

        if([str1 isEqual:str3]){

            NSLog(@"str1和str3内容相等");

        }

        //专门给字符串类定制的比较方法

        if([str1 isEqualToString:str3]){

            NSLog(@"str1和str3的内容肯定是相同的");

        }

        

        //判断是否是指定字符串开始或结束

        NSString *filename = @"HelloWorld.mm";

        if([filename hasPrefix:@"Hello"]){

            NSLog(@"文件名以Hello开始");

        }

        if([filename hasSuffix:@".mm"]) {

            NSLog(@"这个文件是Objective C++源文件");

        }

    }

    //改变大小写

    void test9()

    {

        NSString *str = @"Hello World.";

        str = [str lowercaseString];

        NSLog(@"str:%@", str);

        str = [str capitalizedString];

        NSLog(@"str:%@", str);

    }

    //将字符串转换成其他基本类型

    void test10()

    {

        NSString *str1 = @"123";

        int i1 = [str1 intValue];

        NSLog(@"i1=%d", i1);

        NSInteger i2 = [str1 integerValue];

        NSLog(@"i2=%ld", i2);

        NSString *str2 = @"3.1415926";

        float f = [str2 floatValue];

        NSLog(@"f=%f", f);

    }

    获取从第八个以后的字符串

    NSString *str2 = [str substringFromIndex:8];

    获取从第0个到第7个字符串

    NSString *str3 = [str substringToIndex:8];

    从第二个开始,获取四个字符串

     NSRange r = NSMakeRange(2, 4);

     NSString *str4 = [str substringWithRange:r];

    查找子串,默认是大小写敏感

    NSString *str = @"Hello World.";

    NSRange r = [str rangeOfString:@“LLO"];

    忽略大小写查找子串

    r=[str rangeOfString:@“LLO" options:NSCaseInsensitiveSearch];

    替换子串

    str = [str stringByReplacingOccurrencesOfString:@".mm" withString:@“.java"];

    替换指定范围子串

    str = [str stringByReplacingCharactersInRange:NSMakeRange(2, 3) withString:@"HELLO"];

    比较大小

    NSComparisonResult result = [str1 compare:str2];

    忽略大小写

    [str1 compare:str2 options:NSCaseInsensitiveSearch]

    判断是否是指定字符串开始或结束

    开始

    [filename hasPrefix:@“Hello”]

    结束

    [filename hasSuffix:@“.mm"]

    改变大小写

    str = [str lowercaseString];

    str = [str capitalizedString];

    NSDate

    目标时间距离现在时间差24*60*6秒,可变

    NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:24 * 60 * 60];

    自1970年到现在的总秒数

    NSTimeInterval sec = date.timeIntervalSince1970;

    //格式化处理日期对象 

    //1.要处理的日期对象

        NSDate *date = [NSDate date];

        //2.准备格式对象

        NSDateFormatter *formatter = [[NSDateFormatter alloc]init];

        //3. 设置格式串属性

        formatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";

        //4. 进行格式化(将日期转成字符串)

        NSString *formatString = [formatter stringFromDate:date];

    //将字符串转成日期

        NSString *dateString = @"2016-01-01 02:03:04";

        NSDate *date2 = [formatter dateFromString:dateString];

    NSArray

    初始化

    //1. 字面值方式

    NSArray *arr1 = @[@"aaa", @"bbb", @"ccc"];

    //2. 工厂方法创建,最后一人元素必须是nil

    NSArray *arr2 = [NSArray arrayWithObjects:@"aaa", @"bbb", @"ccc", @"ddd", nil];

    NSString *strs[4] = {@"aaa", @"bbb", @"ccc", @"ddd"}; NSArray *arr3 =[NSArray arrayWithObjects:strs count:4];

    //遍历数组

    //数组中只能放对象(对象的引用),不能放非对象类型(C语言中的基本类型,结构体等),数组中的每个元素是id类型的引用

     NSArray *arr = @[@"aaa", @"bbb", @"ccc", @"ddd"];

        NSLog(@"%@", arr);

        //1. 使用数组下标的方式进行遍历

        for(int i=0; i<arr.count; i++){

            NSString *str = arr[i];

            NSLog(@"%@", str);

            if(i == 2)break;

        }

        //2. 使用forin loop循环的方式进行遍历

        for(NSString *str in arr){

            NSLog(@"%@", str);

            //if (不需要遍历了)break;

        }

        //3. 使用Block进行遍历

    [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 

    {

            NSLog(@"下标为%lu的元素是%@", idx, obj);

            if(idx == 2)*stop = YES;

      }];

    4. 使用迭代器来遍历

       NSEnumerator *enumerator = [arr objectEnumerator];

    //获取迭代器

        NSString *obj = nil;

        while(obj = [enumerator nextObject]){ //通过迭代器拿数组中的一个对象

            NSLog(@"%@", obj);//对获得的对象进行处理

        }

    数组的拷贝

    //浅拷贝

        NSArray *arr3 = [[NSArray alloc]initWithArray:arr1 copyItems:NO];

     //深拷贝

        NSArray *arr4 = [[NSArray alloc]initWithArray:arr1 copyItems:YES];

    常用方法

    NSArray *arr = @[@"aaa", @"bbb", @"ccc", @"ddd"];

       NSString *str = [[NSString alloc]initWithFormat:@“%@",@"bbb"];

     if([arr containsObject:str]){

            NSLog(@"数组中有这个对象");

        }

     //从数组中查找对象,返回其下标,比较的是内容(isEqual:)

        NSInteger index = [persons indexOfObject:p4];

        if (index == NSNotFound) {

            NSLog(@"没有王小二");

        }else{

            NSLog(@"王小二在下标%ld的位置", index);

        }

    //下面方法比较的是地址(没有使用isEqual:方法)

        index = [persons indexOfObjectIdenticalTo:p4];

        if (index == NSNotFound) {

            NSLog(@"数组中没有这个对象");

        }else{

            NSLog(@"对象的下标是:%ld", index);

        }

        

    //添加一个字符串

     NSArray *arr = @[@"aaa", @"bbb", @"ccc", @"ddd"];

        arr = [arr arrayByAddingObject:@"eee"];

        NSLog(@"%@", arr);

    排序

    //对自己定义的对象进行排序

    NSInteger personSortRule(id obj1, id obj2, void*p)

    {

        TRPerson *person1 = obj1;

        TRPerson *person2 = obj2;

        if(person1.age < person2.age) return -1;

        else if(person1.age > person2.age) return 1;

        return 0;

    }

    void test8()

    {

        TRPerson *p1 = [[TRPerson alloc]initWithName:@"张三" andAge:30];

        TRPerson *p2 = [[TRPerson alloc]initWithName:@"李四" andAge:23];

        TRPerson *p3 = [[TRPerson alloc]initWithName:@"王小二" andAge:26];

        NSArray *persons = @[p1, p2, p3];

        //要求按年龄进行排序

        NSArray *sortedPersons = [persons sortedArrayUsingFunction:personSortRule context:nil];

    //使用Block进行排序

        sortedPersons = [persons sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

            TRPerson *p1 = obj1;

            TRPerson *p2 = obj2;

            if(p1.age < p2.age) return NSOrderedAscending;

            else if(p1.age > p2.age) return NSOrderedDescending;

            return NSOrderedSame;

        }];

    NSArray *emps = @[e1, e2, e3, e4];

    //key要的是参与排序的所有对象的某个属性的名字,如果参与排序的对象没有这个属性,排序会导致程序崩溃

        NSSortDescriptor *desc1 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];

        NSSortDescriptor *desc2 = [NSSortDescriptor sortDescriptorWithKey:@"salary" ascending:YES];

        NSArray *sortedEmps = [emps sortedArrayUsingDescriptors:@[desc1, desc2]];

    NSSET

    初始化

    NSSet *set = [NSSet setWithObjects:@"aaa", @"bbb", @"ccc", @"aaa", nil];

    NSSet ==> NSArray

        NSArray *objs = [set allObjects];

    从set中随便拿一个对象

    NSString *str = [set anyObject];

    [objs firstObject];//数组中的第一个元素

    [objs lastObject];//最后的一个元素

    //判断set中有没有指定的对象

    if([set containsObject:@“ccc"])

    遍历set

    forin

    for (NSString *str in set)

    {

        NSLog(@"%@", str);

    }

    //枚举器(迭代器)

        NSEnumerator *enumerator = [set objectEnumerator];

        NSString *str = nil;

        while(str = [enumerator nextObject]) {//拿其中一个对象

            NSLog(@"%@", str);

        }

    //使用Block

    [set enumerateObjectsUsingBlock:^(id obj, BOOL *stop) 

    {

            NSString *str = obj;

            NSLog(@"%@", str);

            if([str isEqualToString:@"aaa"]){

                *stop = YES;//终止遍历

            }

        }];

    排序

    //将set变成数组再进行排序

        NSArray *sortedArray = [[set allObjects]sortedArrayUsingSelector:@selector(compare:)];

    //Set间的计算

    if([s2 isSubsetOfSet:s1])

    {

         NSLog(@"s2是s1的子集");

     }

    if([s1 intersectsSet:s3])

    {

         NSLog(@"s1和s3相交");

     }

    NSMutableSet

    添加或修改set中的元素

    NSMutableSet *mSet = [NSMutableSet new];

    [mSet addObject:@"aaa"];

    [mSet addObjectsFromArray:@[@"bbb", @"ccc", @“bbb"]];

    [mSet removeObject:@“ccc"];

    //集合运算

        NSMutableSet *s1 = [NSMutableSet setWithObjects:@"A", @"B", @"C", nil];

        NSMutableSet *s2 = [NSMutableSet setWithObjects:@"C", @"D", nil];

    [s1 unionSet:s2]; s1=a,b,c,d

    [s1 minusSet:s2]; s1=a,b

    [s1 addObject:@"C"];

    [s1 addObject:@"E"];//A B C E

    [s1 intersectSet:s2] s1=c

    [s1 setSet:s2]; s1=c,d

    NSDictionary

    初始化

    NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"Daniel", @"30"] forKeys:@[@"name", @“age"]];

    NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:@"Guodh", @"name", @"32", @"age", @"male", @"gender",nil];

    NSDictionary *dict3 = @{ @"name" : @"Guodenghong", @"age":@35, @“gender":@"male"};

    //使用下标访问key对应的value

    NSString *name = dict[@"name"];

    NSString *gender = [dict objectForKeyedSubscript:@"gender"];

    NSNumber *age = [dict objectForKey:@“age"];

    遍历字典

    //遍历一

        NSArray *keys = [dict allKeys];

        for (NSString *key in keys) {

            id value = dict[key];

            NSLog(@"%@:%@", key, value);

        }

    //遍历所所有value

        NSArray *values = [dict allValues];

        NSLog(@"%@", values);

    //使用迭代器(枚举器)

        NSEnumerator *enumerator = [dict keyEnumerator];

        id key = nil;

        while(key = [enumerator nextObject]) {

            id value = dict[key];

            NSLog(@"%@,%@", key, value);

        }

    //使用Block

        [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

            NSLog(@"%@:%@", key, obj);

        }];

    排序

    NSDictionary *dict = @{@"Daniel":@10, @"Guodh":@15, @"Mengriri": @5, @"Qinxi":@25};

        NSArray *keys = [dict keysSortedByValueUsingSelector:@selector(compare:)];

    NSMutableDictionary

    初始化

    NSMutableDictionary *mDict = [NSMutableDictionary new];

        [mDict setObject:@"Daniel" forKey:@"name"];

        [mDict setObject:@"35" forKey:@"age"];

        mDict[@"gender"] = @“male";

    添加

     mDict[@"age"] = @“36";

    移除

    [mDict removeObjectForKey:@"name"];

    [mDict removeObjectsForKeys:@[@"age", @“gender"]];

    重点:比较时一定要重写这两个方法

    - (BOOL)isEqual:(id)object

    {

        if (self == object) {return YES;}

        if (object == nil) {return NO;}

        if (![object isKindOfClass:[self class]]) {

            return NO;

        }

        TRHero *h = object;

        return [self.title isEqualToString:h.title] && [self.name isEqualToString:h.name];

    }

    //确保相同对象的hash值一定相等,不同对象的hash值尽可能不等。

    - (NSUInteger)hash

    {

        return self.power ^ self.title.hash ^ self.name.hash;

    }

    //将数组中所有的字典信息写入文件,要求字典中的key和value都是NSString或NSNumber等

    void test1()

    {

        //用字典保存一个账户信息

        NSDictionary *acc1 = @{

                            @"id" :@"1000001",

                            @"name":@"Daniel",

                            @"balance":@12340000.15,

                            @"loan":@8000000.0

        };

        NSDictionary *acc2 = @{

                               @"id" :@"1000002",

                               @"name":@"Shasha",

                               @"balance":@12340.0,

                               @"loan":@0.0

                               };

        NSDictionary *acc3 = @{

                               @"id" :@"1000003",

                               @"name":@"Shanshan",

                               @"balance":@100000.0,

                               @"loan":@5000.0

                               };

        NSDictionary *acc4 = @{

                               @"id" :@"1000004",

                               @"name":@"Lisa",

                               @"balance":@120000.0,

                               @"loan":@8000.0

                               };

        NSArray *accounts = @[acc1, acc2, acc3, acc4];

        [accounts writeToFile:@"/Users/Daniel/Desktop/account.plist" atomically:YES];

    }

      将字典转换成NSdata类型步骤:

    将字典转换成字符串类型

     */

            NSDictionary *dictContent = @{

                                          @"id" :@"1000001",

                                          @"name":@"Daniel",

                                          @"balance":@12340000.15,

                                          @"loan":@8000000.0

                                          };

            

            //先把字典转换成字符串类型

            NSString *dicStr = [dictContent description];

            //在把字符串类型转换成NSData

            NSData *dicData = [dicStr dataUsingEncoding:NSUTF8StringEncoding];

            

            BOOL isSuccess = [self.manager createFileAtPath:dictionaryPath contents:dicData attributes:nil];

    //         BOOL isSuccess1 = [dictContent writeToFile:dictionaryPath atomically:YES];

            if (isSuccess)

            {

                NSLog(@"字典写入成功");

            }

        }

    }

    从文件中读取数据到数组中

    #import "TRAccount.h"

    void test2()

    {

        //从文件中读取数据到数组,此时数组中的每个元素都是一个字典

        NSArray *accounts = [NSArray arrayWithContentsOfFile:@"/Users/Daniel/Desktop/account.plist"];

        //准备一个数组,用来保存所有的转换后的对象

        NSMutableArray *accountObjs = [NSMutableArray new];

        //将数组中的每一个字典转换成TRAccount类型的对象

        for (NSDictionary *dict in accounts) {

            //dict ==> TRAccount

            /*

            TRAccount *acc = [[TRAccount alloc]initWithId:dict[@"id"] andName:dict[@"name"]];

            acc.balance = [dict[@"balance"]doubleValue];

            acc.loan = [dict[@"loan"]doubleValue];

             */

            TRAccount *acc = [TRAccount accountWithDictionary:dict];

            [accountObjs addObject:acc];

        }

        //遍历对象数组

        for (TRAccount *acc in accountObjs) {

            NSLog(@"%@", acc);

        }

    }

    使用字典初始化当前对象

    - (instancetype)initWithDictionary:(NSDictionary *)dict

    {

        if (self = [self initWithId:dict[@"id"] andName:dict[@"name"]]) {

            _balance = [dict[@"balance"]doubleValue];

            _loan = [dict[@"loan"]doubleValue];

        }

        return self;

    }

    label

    设置大小

    label.frame = CGRectMake(50, 50, 250, 200);

    设置内容

    label.text = @"这是一段测试文字";

    设置背景色    

    label.backgroundColor = [UIColor colorWithRed:120/255.0 green:79/255.0 blue:120/255.0 alpha:1];

    设置字体大小    

    label.font = [UIFont systemFontOfSize:20];

    设置字体颜色

    label.textColor = [UIColor whiteColor];

    设置行数,默认1,0代表无限制

    label.numberOfLines = 0;

    设置“…”的位置,具体看enum

    label.lineBreakMode = NSLineBreakByTruncatingMiddle;

    设置文字位置(左对齐,右对齐,居中)

    label.textAlignment = NSTextAlignmentCenter;

    button

    button.frame = CGRectMake(20, 30, 200, 30);

    [button setTitle:@“添加标签"     forState:UIControlStateNormal];

    [button setBackgroundColor:[UIColor lightGrayColor]];

    为按钮添加点击事件

    [button addTarget:self action:@selector(addLabel:) forControlEvents:UIControlEventTouchUpInside];

    3.添加到控制器的view中

    [self.view addSubview:button];

    本随笔是夜鹰噬魂个人笔记总结!请不要随意转载!谢谢!
  • 相关阅读:
    4、Android-数据存储方案(文件存储/SharedPreferences)
    3、Android-全局大喇叭-广播机制
    2、Android-UI(关于Nine-Patch图片)
    2、Android-UI(RecyclerView)
    2、Android-UI(自定义控件&ListView)
    2、Android-UI(布局待完成)
    2、Android-UI(常用控件)
    1、Android-活动(下)
    1、Android-活动(上)
    8、Spring Cloud-配置中心 Spring Cloud Config(待补充)
  • 原文地址:https://www.cnblogs.com/hytx/p/5046247.html
Copyright © 2020-2023  润新知