iOS - OC NSArray 数组

前言

    @interface NSArray<__covariant ObjectType> : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>
    @interface NSMutableArray<ObjectType> : NSArray<ObjectType>
  • 数组只能存储 OC 对象,不能存储 C 语言中的基本数据类型,也不能存储 nil 。
  • Xcode 7 对系统中常用的一系列容器类型都增加了泛型支持(),有了泛型后就可以指定容器类中对象的类型了。假如向泛型容器中加入错误的对象,编译器会报警告。
        __covariant:协变性,子类型可以强转到父类型(里氏替换原则)。
        __contravariant:逆变性,父类型可以强转到子类型。
  • 不指定泛型类型的对象可以和任意泛型类型转化,但指定了泛型类型后,两个不同类型间是不可以强转的,假如你希望主动控制转化关系,就需要使用泛型的协变性和逆变性修饰符。

1、不可变数组 NSArray 的创建

    // 直接创建不可变数组
    /*
        数组成员是 id 类型,表示数组元素可以是任意的 oc 对象。
    */
    NSArray *arr1 = @[@"bei", @"jing", @"huan", @"ying", @"nin"];

    // 对象方法创建

        NSArray *arr2 = [[NSArray alloc] init];

        // 和 arr1 的地址不相同
        NSArray *arr3 = [[NSArray alloc] initWithArray:arr1];

        NSArray *arr4 = [[NSArray alloc] initWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];

    // 类方法创建

        NSArray *arr5 = [NSArray array];

        // 和 arr1 的地址不相同
        NSArray *arr6 = [NSArray arrayWithArray:arr1];

        // 创建只有一个元素(id)的数组
        NSArray *arr7 = [NSArray arrayWithObject:@"qian"];

        NSArray *arr8 = [NSArray arrayWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];

    // 从 文件 创建字符串
    NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Desktop/test.txt"];

    NSArray *arr9 = [[NSArray alloc] initWithContentsOfFile:path];
    NSArray *arr10 = [NSArray arrayWithContentsOfFile:path];

    // 从 Url 创建字符串
    /*
        file:// 文件前缀
    */
    NSURL *url = [NSURL URLWithString:[@"file://" stringByAppendingString:[NSHomeDirectory()
                                                  stringByAppendingString:@"/Desktop/test.txt"]]];

    NSArray *arr11 = [[NSArray alloc] initWithContentsOfURL:url];
    NSArray *arr12 = [NSArray arrayWithContentsOfURL:url];

    // 泛型定义

        // 指明数组中存放的是 NSString 类型数据
        NSArray<NSString *> *arr13 = @[@"bei", @"jing", @"huan", @"ying", @"nin"];

        // 指明数组中存放的是 NSNumber 类型数据
        NSArray<NSNumber *> *arr14 = @[@2, @4, @6, @8, @10];

2、数组成员个数计算

    NSArray *arr = @[@"bei", @"jing", @"huan", @"ying", @"nin"];

    NSUInteger length = [arr count];

3、从数组中取成员

    NSArray *arr = @[@"bei", @"jing", @"huan", @"ying", @"nin"];

    // []
    NSArray *arr1 = arr[1];

    // objectAtIndex
    NSArray *arr2 = [arr objectAtIndex:2];

    // subarrayWithRange
    NSArray *arr3 = [arr subarrayWithRange:NSMakeRange(2, 2)];

    // for...in 循环
    /*
        取出数组中的每个元素,分别保存在 tmp 中
    */
    for (NSString *tmp in arr) {

        NSLog(@"%@", tmp);
    }

    // id (void *) 泛型指针, 取出数组中的每个元素,分别保存在 tmp 中
    for (id tmp in arr) {

        NSLog(@"tmp = %@", tmp);
    }

4、取数组中最后一个元素

    NSArray *arr = @[@"bei", @"jing", @"huan", @"ying", @"nin"];

    id lastObject1 = [arr lastObject];

    id lastObject2 = arr[[arr count]-1];

5、由元素的值获取下标

    NSArray *arr = @[@"bei", @"jing", @"huan", @"ying", @"nin"];

    NSUInteger index = [arr indexOfObject:@"huan"];

6、判断数组中是否包含某个元素

    NSArray *arr = @[@"bei", @"jing", @"huan", @"ying", @"nin"];

    BOOL result = [arr containsObject:@"huan"];

7、数组的比较

    NSArray *arr1 = @[@"bei", @"jing", @"huan", @"ying", @"nin"];
    NSArray *arr2 = @[@"ni", @"hao", @"bei", @"jing"];

    // isEqualToArray

    // 比较两个数组内容是否相同
    BOOL bl = [arr1 isEqualToArray:arr2];

    // firstObjectCommonWithArray

    // 返回两个数组中第一个相同的元素
    NSString *str = [arr1 firstObjectCommonWithArray:arr2];

8、数组组合

    NSArray *arr1 = @[@"bei", @"jing", @"huan", @"ying", @"nin"];
    NSArray *arr2 = @[@"Users", @"JHQ0228", @"Desktop"];

    // 按指定字符组合
    NSString *str1 = [arr1 componentsJoinedByString:@" "];

    // 按路径组合
    /*
        将数组中的元素自动组合成路径,在每个元素之间自动加上 “/”
    */
    NSString *str2 = [NSString pathWithComponents:arr2];

9、可变数组 NSMutableArray 的创建

    // 对象方法创建
    /*
        创建指定长度的数组,预先分配空间,提高效率,实际长度可大于指定长度
    */
    NSMutableArray *arr1 = [[NSMutableArray alloc] initWithCapacity:0];

    // 类方法创建
    /*
        创建指定长度的数组,预先分配空间,提高效率,实际长度可大于指定长度
    */
    NSMutableArray *arr2 = [NSMutableArray arrayWithCapacity:0];

10、数组元素的添加

    NSMutableArray *arr = [NSMutableArray arrayWithCapacity:0];

    // addObject

        // 向数组中追加一个元素
        [arr addObject:@"bei"];

    // addObjectsFromArray

        // 追加数组
        NSArray *arrAdd = @[@"dian", @"ying", @"xue", @"yuan"];
        [arr addObjectsFromArray:arrAdd];

    // insertObject... atIndex

        // 在数组中任意位置插入一个元素
        [arr insertObject:@"hao" atIndex:2];

    // arrayByAddingObject

        // 向数组添加一个元素,返回一个新的数组
        NSArray *arr1 = [arr arrayByAddingObject:@"ma"];

11、数组元素的删除

    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"nan", @"jing", @"huan", @"ying",
                                                           @"nin", @"bei", @"jing", @"ni", @"hao", nil];

    // 删除指定下标的元素
    [arr removeObjectAtIndex:2];

    // 删除指定元素,删除所有指定元素
    [arr removeObject:@"ying"];

    // 删除指定元素
    [arr removeObjectIdenticalTo:@"nan"];

    // 删除指定范围的元素
    NSRange range = {2,1};
    [arr removeObjectsInRange:range];

    // 删除最后一个元素
    [arr removeLastObject];

    // 删除所有元素
    [arr removeAllObjects];

12、数组元素的替换

    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"nan", @"jing", @"hao", nil];

    // 替换指定下标元素
    [arr replaceObjectAtIndex:1 withObject:@"ren"];

13、数组元素的交换

    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"bei", @"jing", @"nin", @"hao", nil];

    [arr exchangeObjectAtIndex:0 withObjectAtIndex:1];

14、数组元素的修改

    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"bei", @"jing", @"nin", @"hao", nil];

    // 修改整个数组(覆盖重写)
    [arr setArray:@[@"bei", @"jing", @"huan", @"ying",  @"nin"]];

    // 修改数组中的某个元素
    arr[3] = @"huan";

15、给数组里的所有元素发送一个消息

    Student *stu1 = [[Student alloc] init];
    Student *stu2 = [[Student alloc] init];
    Student *stu3 = [[Student alloc] init];

    NSArray *arr = [NSArray arrayWithObjects:stu1, stu2, stu3, nil];

    // 发送消息
    [arr makeObjectsPerformSelector:@selector(studentTest)];

16、数组的遍历

  • 用 for 循环遍历

        NSArray * array = [NSArray arrayWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];
    
        for (int i = 0; i < [array count]; i ++) {
    
            NSLog(@"%@", array[i]);
        }
  • 用 for...in 循环遍历
        NSArray *array = [NSArray arrayWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];
    
        // id (void *) 泛型指针, 取出数组中的每个元素,分别保存在 tmp 中
        for (id tmp in array) {
    
            NSLog(@"%@", tmp);
        }
    
        // 取出数组中的每个元素,分别保存在 tmp 中
        for (NSString *tmp in array) {
    
            NSLog(@"%@", tmp);
        }
  • 用 block 循环遍历
        NSArray *array = [NSArray arrayWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];
    
        [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    
            // obj == array[i],idx == i
            NSLog(@"%@", obj);
    
            if ([obj  isEqual: @"huan"]) {
    
                // 停止遍历
                *stop = YES;
            }
        }];
  • 用迭代器遍历
        NSArray *array = [NSArray arrayWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];
    
        // 获取数组的正序迭代器
        NSEnumerator *enu1 = [array objectEnumerator];
    
        // 获取数组的反序迭代器
        NSEnumerator *enu2 = [array reverseObjectEnumerator];
    
        id obj = nil;
    
        // 正序,获取下一个需要遍历的元素
        while (obj = [enu1 nextObject]) {
    
            NSLog(@"%@", obj);
        }
    
        // 反序,获取下一个需要遍历的元素
        while (obj = [enu2 nextObject]) {
    
            NSLog(@"%@", obj);
        }
  • 条件遍历
        // 1.indexesOfObjectsPassingTest
    
            NSArray *array = [NSArray arrayWithObjects:@3, @8, @17, @2, @25, @6, @89, nil];
    
            NSIndexSet *indexSet = [array indexesOfObjectsPassingTest:^BOOL(id  _Nonnull obj,
                                                                              NSUInteger idx,
                                                                         BOOL * _Nonnull stop) {
    
                // 遍历数组,找出数组中所有大于 10 的元素的位置
                return [obj intValue] > 10 ? : NO;
            }];
    
            [indexSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {
    
                // 输出所有大于 10 的元素值
                NSLog(@"%@", array[idx]);
            }];
    
        // 2.indexOfObjectPassingTest
    
            NSUInteger index = [array indexOfObjectPassingTest:^BOOL(id  _Nonnull obj,
                                                                       NSUInteger idx,
                                                                  BOOL * _Nonnull stop) {
    
                // 遍历数组,找出数组中第一个大于 10 的元素的位置
                return [obj intValue] > 10 ? : NO;
            }];
    
            // 输出第一个大于 10 的元素值
            NSLog(@"%@", array[index]);

17、数组排序

  • 冒泡排序

        NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"sunday", @"sunny", @"summer", @"sun", nil];
    
        for (int i = 0; i < [arr count] - 1; i++) {
            for (int j = 0; j < [arr count] - 1 - i; j++) {
    
                // 大小判断 arr[j] > arr[j + 1]
                if ([arr[j] compare:arr[j + 1]] == NSOrderedDescending) {
    
                    // 位置交换
                    [arr exchangeObjectAtIndex:j withObjectAtIndex:(j + 1)];
                }
            }
        }
  • 用指定的方法排序
        // 1.用指定的方法排序,可变数组排序
    
            NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"sunday", @"sunny", @"summer", @"sun", nil];
    
            // 原数组的顺序改变,指定元素的比较方法:compare:,默认排序方式为升序排列
            [arr1 sortUsingSelector:@selector(compare:)];
    
            // 使排序结果 降序 排列
            NSEnumerator *enu = [arr1 reverseObjectEnumerator];
    
            id obj = nil;
            while (obj = [enu nextObject]) {
    
                // 排序后的结果为降序
                NSLog(@"%@", obj);
            }
    
        // 2.用指定的方法排序,不可变数组排序
    
            NSArray *arr2 = [NSArray arrayWithObjects:@"sunday", @"sunny", @"summer", @"sun", nil];
    
            // 返回一个排好的数组,原数组的顺序不变,指定元素的比较方法:compare:
            NSArray *arr3 = [arr2 sortedArrayUsingSelector:@selector(compare:)];
    
        // 3.用指定的方法排序,自定义类
    
            //  People.h
    
                #import <Foundation/Foundation.h>
    
                @interface People : NSObject
    
                // 名
                @property (nonatomic, retain) NSString *firstname;
    
                // 姓
                @property (nonatomic, retain) NSString *lastname;
    
                + (id)peopleWithFirstname:(NSString *)firstname lastname:(NSString *)lastname;
    
                // 返回值类型为 NSComparisonResult
                - (NSComparisonResult)comparePeople:(People *)peop;
    
                @end
    
            //  People.m
    
                #import "People.h"
    
                @implementation People
    
                + (id)peopleWithFirstname:(NSString *)firstname lastname:(NSString *)lastname {
                    People * peop = [[People alloc] init];
    
                    peop.lastname = lastname;
                    peop.firstname = firstname;
    
                    return peop;
                }
    
                - (NSComparisonResult)comparePeople:(People *)peop {
    
                    // 先按照姓排序
                    NSComparisonResult result = [self.lastname compare: peop.lastname];
    
                    if (result == NSOrderedSame) {
    
                        // 如果有相同的姓,就比较名字
                        result = [self.firstname compare: peop.firstname];
                    }
    
                    return result;
                }
    
                -(NSString *)description{
    
                    return [NSString stringWithFormat:@"%@ %@", self.firstname, self.lastname];
                }
    
                @end
    
            //  main.m
    
                #import "People.h"
    
                People *peop1 = [People peopleWithFirstname:@"MingJie" lastname:@"Li"];
                People *peop2 = [People peopleWithFirstname:@"LongHu" lastname:@"Huang"];
                People *peop3 = [People peopleWithFirstname:@"LianJie" lastname:@"Li"];
                People *peop4 = [People peopleWithFirstname:@"Jian" lastname:@"Xiao"];
    
                // 1.用指定的方法排序,可变数组排序
    
                    NSMutableArray *array1 = [NSMutableArray arrayWithObjects:peop1, peop2, peop3, peop4, nil];
    
                    // 原数组的顺序改变
                    [array1 sortUsingSelector:@selector(comparePeople:)];
    
                // 2.用指定的方法排序,不可变数组排序
    
                    NSArray *array2 = [NSArray arrayWithObjects:peop1, peop2, peop3, peop4, nil];
    
                    // 返回一个排好的数组,原数组的顺序不变
                    NSArray *array3 = [array2 sortedArrayUsingSelector:@selector(comparePeople:)];
  • 用 Block 排序
        // 1.利用 block 进行排序,可变数组排序
    
            NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"sunday", @"sunny", @"summer", @"sun", nil];
    
            [arr1 sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
    
                // 指定比较的方法,两个元素值比较
                NSComparisonResult result = [obj1 compare:obj2];
    
                // 返回比较的结果
                return result;
            }];
    
        // 2.利用 block 进行排序,不可变数组排序
    
            NSArray *arr2 = [NSArray arrayWithObjects:@"sunday", @"sunny", @"summer", @"sun", nil];
    
            // 返回一个排好的数组
            NSArray *arr3 = [arr2 sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
    
                // 指定比较的方法,两个元素值比较
                NSComparisonResult result = [obj1 compare:obj2];
    
                // 返回比较的结果
                return result;
            }];
    
        // 3.利用 block 进行排序,自定义类
    
            // People1.h
    
                #import <Foundation/Foundation.h>
    
                @interface People1 : NSObject
    
                // 名
                @property (nonatomic, retain) NSString *firstname;
    
                // 姓
                @property (nonatomic, retain) NSString *lastname;
    
                + (id)peopleWithFirstname:(NSString *)firstname lastname:(NSString *)lastname;
    
                @end
    
            // People1.m
    
                #import "People1.h”
    
                @implementation People1
    
                + (id)peopleWithFirstname:(NSString *)firstname lastname:(NSString *)lastname {
                    People1 * peop = [[People1 alloc] init];
    
                    peop.lastname = lastname;
                    peop.firstname = firstname;
    
                    return peop;
                }
    
                -(NSString *)description{
    
                    return [NSString stringWithFormat:@"%@ %@", self.firstname, self.lastname];
                }
    
                @end
    
            // main.m
    
                #import "People1.h”
    
                People1 *peop1 = [People1 peopleWithFirstname:@"MingJie" lastname:@"Li"];
                People1 *peop2 = [People1 peopleWithFirstname:@"LongHu" lastname:@"Huang"];
                People1 *peop3 = [People1 peopleWithFirstname:@"LianJie" lastname:@"Li"];
                People1 *peop4 = [People1 peopleWithFirstname:@"Jian" lastname:@"Xiao"];
    
                // 1.利用 block 进行排序,可变数组排序
    
                    NSMutableArray *array1 = [NSMutableArray arrayWithObjects:peop1, peop2, peop3, peop4, nil];
    
                    [array1 sortUsingComparator:^NSComparisonResult(People1 *  _Nonnull obj1, People1 *  _Nonnull obj2) {
    
                        // 先按照姓排序
                        NSComparisonResult result = [obj1.lastname compare:obj2.lastname];
    
                        if (result == NSOrderedSame) {
    
                            // 如果有相同的姓,就比较名字
                            result = [obj1.firstname compare:obj2.firstname];
                        }
    
                        return result;
                    }];
    
                // 2.利用 block 进行排序,不可变数组排序
    
                    NSArray *array2 = [NSArray arrayWithObjects:peop1, peop2, peop3, peop4, nil];
    
                    NSArray *array3 = [array2 sortedArrayUsingComparator:^NSComparisonResult(People1 *  _Nonnull obj1,
                                                                                             People1 *  _Nonnull obj2) {
    
                        // 先按照姓排序
                        NSComparisonResult result = [obj1.lastname compare:obj2.lastname];
    
                        if (result == NSOrderedSame) {
    
                            // 如果有相同的姓,就比较名字
                            result = [obj1.firstname compare:obj2.firstname];
                        }
    
                        return result;
                    }];
  • 按描述器排序
        //  Book.h
    
            #import <Foundation/Foundation.h>
    
            @interface Book : NSObject
    
            @property (nonatomic, retain) NSString *name;
    
                + (id)bookWithName:(NSString *)name;
    
            @end
    
        //  Book.m
    
            #import "Book.h"
    
            @implementation Book
    
            + (id)bookWithName:(NSString *)name {
                Book *book = [[Book alloc] init];
                book.name = name;
                return book;
            }
    
            @end
    
        //  People2.h
    
            #import <Foundation/Foundation.h>
    
            @class Book;
    
            @interface People2 : NSObject
    
            // 名
            @property (nonatomic, retain) NSString *firstname;
    
            // 姓
            @property (nonatomic, retain) NSString *lastname;
    
            // 书
            @property (nonatomic, retain) Book *book;
    
            + (id)peopleWithFirstname:(NSString *)firstname lastname:(NSString *)lastname bookName:(NSString *)bookName;
    
            @end
    
        //  People2.m
    
            #import "People2.h"
            #import "Book.h"
    
            @implementation People2
    
            + (id)peopleWithFirstname:(NSString *)firstname lastname:(NSString *)lastname bookName:(NSString *)bookName {
    
                People2 *peop = [[People2 alloc] init];
    
                peop.lastname = lastname;
                peop.firstname = firstname;
                peop.book = [Book bookWithName:bookName];
    
                return peop;
            }
    
            - (NSString *)description{
    
                return [NSString stringWithFormat:@"%@ %@, bookName: %@", self.firstname, self.lastname, self.book.name];
            }
    
            @end
    
        // main.m
    
            #import "People2.h"
    
            People2 *peop1 = [People2 peopleWithFirstname:@"MingJie" lastname:@"Li" bookName:@"book1"];
            People2 *peop2 = [People2 peopleWithFirstname:@"LongHu" lastname:@"Huang" bookName:@"book2"];
            People2 *peop3 = [People2 peopleWithFirstname:@"LianJie" lastname:@"Li" bookName:@"book2"];
            People2 *peop4 = [People2 peopleWithFirstname:@"Jian" lastname:@"Xiao" bookName:@"book1"];
    
            // 先按照书名进行排序
            /*
                这里的 key 写的是 @property 的名称
            */
            NSSortDescriptor *bookNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"book.name" ascending:YES];
    
            // 再按照姓进行排序
            NSSortDescriptor *lastnameDesc = [NSSortDescriptor sortDescriptorWithKey:@"lastname" ascending:YES];
    
            // 再按照名进行排序
            NSSortDescriptor *firstnameDesc = [NSSortDescriptor sortDescriptorWithKey:@"firstname" ascending:YES];
    
            // 1.按描述器排序,可变数组排序
    
                NSMutableArray *array1 = [NSMutableArray arrayWithObjects:peop1, peop2, peop3, peop4, nil];
    
                // 按顺序添加排序描述器
                NSMutableArray *descs1 = [NSMutableArray arrayWithObjects:bookNameDesc, lastnameDesc, firstnameDesc, nil];
    
                [array1 sortUsingDescriptors:descs1];
    
            // 2.按描述器排序,不可变数组排序
    
                NSArray *array2 = [NSArray arrayWithObjects:peop1, peop2, peop3, peop4, nil];
    
                // 按顺序添加排序描述器
                NSArray *descs2 = [NSArray arrayWithObjects:bookNameDesc, lastnameDesc, firstnameDesc, nil];
    
                NSArray *array3 = [array2 sortedArrayUsingDescriptors:descs2];
时间: 2024-08-10 01:25:05

iOS - OC NSArray 数组的相关文章

iOS中NSArray数组常用处理方式_IOS

1. 数组的常用处理方式 //--------------------不可变数组 //1.数组的创建 NSString *s1 = @"zhangsan"; NSString *s2 = @"lisi"; NSString *s3 = @"wangwu"; //(1) NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil]; NSLog(@"%@",a

iOS 中由数组 NSArray 与 NSMutableArray 的使用理解偏差引发的多宗血案

iOS 中由数组 NSArray 与 NSMutableArray 的使用理解偏差引发的多宗血案 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 这个简单问题,一直以来,五年苹果开发经验告诉我,

iOS : NSArray *groupArray = [[EaseMob sharedInstance].chatManager groupList]; 数组返回是空的

问题描述 iOS : NSArray *groupArray = [[EaseMob sharedInstance].chatManager groupList];明明加了群,返回回来的数组却是空的........ 解决方案 这个是从本地获取的  首先登陆成功后要从服务器请求一次,            //获取数据库中数据             [[EaseMob sharedInstance].chatManager loadDataFromDatabase];             /

iOS - OC 面向对象语法

1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(category):允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量).扩展自己或他人以前实现的类,使它适合自己的需要. 分类的名称括在类名之后的一对圆括号"( )"中. @interface QCStudent (Print) @end @implementation QCStud

ios oc对象不可以直接写到plist中..

问题描述 ios oc对象不可以直接写到plist中.. ios oc对象不可以直接写到plist中..ios oc对象不可以直接写到plist中..ios oc对象不可以直接写到plist中.. 解决方案 你可以写到 NSUserDefault 中, 也就是常说的 User setting, 可以把它当 NSDictionary 来用. 解决方案二: 必须是nsstring,array,dictionary,set等的子类 解决方案三: plist里面一般都是字典数组字符串之类的,你要存对象得

iOS - OC 语言新特性

前言 相对于 Java,OC 语言是一门古老的语言了,而它又是一门不断发展完善的语言.一些新的编译特性,为 OC 语言带来了许多新的活力.在 Xcode7 中,iOS9 的 SDK 已经全面兼容了 Objective-C 的一些新特 性和新功能.这些功能都只作用于编译期,对程序的运行并没有影响,因此,它可以很好的向下进行兼容,无缝的衔接低版本的 iOS 系统,如果可以将这些新特性都应用于开发,开发效率和代码质量,相比之前会有一个很大的提升. 1.可选类型检测 在 swift 语言中,通过 ! 和

iOS - OC RunTime 运行时

1.运行时 运行时是苹果提供的纯 C 语言的开发库,是一种非常牛逼.开发中经常用到的底层技术. 1.1 运行时原理 Objective-C 是一门简单的语言,95% 是 C,只是在语言层面上加了些关键字和语法,真正让 Objective-C 如此强大的是它的运行时.它很小但却很强大,它的核心是消息分发. 1.Messages 执行一个方法,有些语言,编译器会执行一些额外的优化和错误检查,因为调用关系很直接也很明显.但对于消息分发来说,就不那么明显了.在发消息前不必知道某个对象是否能够处理消息.你

iOS - OC 内存管理

1.OC 基本内存管理模型 1.1 自动垃圾收集 在 OC 2.0 中,有一种称为垃圾收集的内存管理形式.通过垃圾收集,系统能够自动监测对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对象会自动释放.iOS 运行环境并不支持垃圾收集,在这个平台开发程序时并没有这方面的选项.在 OS X 10.8 中垃圾收集已不再推荐使用. 1.2 自动释放池 自动释放池(autoreleasepool)的机制是它使得应用在创建新对象时,系统能够有效的管理应用所使用的内存.自动释放池可以追踪需要延时

iOS - OC NSKeyedArchiver 数据归档

前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象.通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象.可以使用归档的方法进行对象的深复制. 采用归档的形式来保存数据,该数据对象需要遵守 NSCoding 协议,并且该对象对应的类必须提供 encodeWithCoder: 和 initWit