结构体和 NSArray

本文详细介绍了Objective-C中的结构体定义与使用,包括NSRange的结构体实例,以及NSString的截取和替换方法。此外,还探讨了NSArray的创建、遍历和常用方法,特别强调了NSMutableArray的可变特性及其在存储和操作对象时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#import <Foundation/Foundation.h>

#import "XWJPerson.h"


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

    @autoreleasepool {

    // NSRange是开发中一个非常常用的类,那么他的本质是什么呢?

        typedef struct _NSRange{

            NSUInteger location;

            NSUInteger length;

        }NSRange;

        

    // 2.定义NSRange结构体变量的方式

        NSRange range;

        range.location = 2;

        range.location = 3;

    // 方式2

        NSRange range2 = {2,3};

    // 方式三

        NSRange range3 = {.location = 2,.length = 3};

    // 上面的定义是不是觉得很烦躁?麻烦吧...那么看下面的终极写法

//        NSRange range4 = NSMakeRange(2, 3);

        // 记得在上面两篇写过一些NSString常用的方法,在这还得花点笔墨来谈谈..

        // 字符串的截取,非常重要

        NSString *xwj = @"道可道,非常道,名可名,非常名.无名天下之始,无名天下之母";

        // 从指定的下标开始一直截取到最后一个字符串(包括标点符号也算一个下标);

       NSString *xwj1 = [xwj substringFromIndex:2];

        // 从头开始截取到指定个数的文字

        NSString *xwj2 = [xwj substringToIndex:3];

        // 截取从指定范围的文字,从下标2开始截取3

        NSString *xwj3 = [xwj substringWithRange:NSMakeRange(2, 3)];

        // 在接着替换字符串

        NSString *xwj4 = @"爱她就要呵护她,就要包容她";

        // 把指定的字符 替换成""也就是什么都没有

        [xwj4 stringByReplacingOccurrencesOfString:@"荣她" withString:@""];

        NSLog(@"%@",xwj4);

        // 把首尾两端的空格去掉.

        NSString *xwj5 = @"          爱无 止境           ";

//    NSString *xwj5 = [xwj5 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

                    // 各位看官,是不是颠覆了你们的认知?

        // 这个只会报一个警告是因为,OC是一门弱语法的语言,任意指针指向任意对象

//            NSMutableArray *Mxwj = [NSMutableArray string];

//        Mxwj = @"我最帅";

//        [Mxwj addObject:@"我爱你"];// 奇葩了,这样居然也不报错. 原因是因为编译检查,编译器认为MxwjNSMutableString类型的,而这个类型有appendString这个方法.

        // 运行的崩溃的原因:运行检查,检查的是Mxwj这个指针是指向的真实类型是NSString NSString没有这个方法所以报错

        

        

/*~~~~~~~~~~~~~NSMutableStringNSString相比之下最大的优势~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

        // NSMutableString创建的对象是可变的,当需要反复拼接/修改的时候,每次操作都在当前对象上进行的,不需要从新向内存申请空间来存储,这样效率更高.

        

        // 前面有总结,现在来复习一下NSArray的使用以及常用的知识点

        // 创建并且初始化一个对象

//        XWJPerson *xwj1 = [[XWJPerson alloc]init];

//         XWJPerson *xwj2 = [[XWJPerson alloc]init];

//         XWJPerson *xwj3 = [[XWJPerson alloc]init];

      XWJPerson *xwj01 = [[XWJPerson alloc]init];

        XWJPerson *xwj02 = [[XWJPerson alloc]init];

        XWJPerson *xwj03 = [[XWJPerson alloc]init];


        // 创建一个数组来 把对象存到数组里面去 后面添加niu以为这存储结束.如果在中途增加nil的话,编译器会把nil NULL看成是基本数据类型0,而数组是无法存储非OC对象的.这点需小心.

        NSArray *xwjArray = [NSArray arrayWithObjects:xwj01,xwj02,xwj03,@"你最帅", nil];

        NSLog(@"%@",xwjArray); // 可以使用%@来打印数组因为,数组里面存储的是OC对象

        // 如果数组里面包含了中文,会打印出unicode编码.

        // 这时候我们可以用一个第三方编写的分类来实现中文的效果.

        // 然而如果对象自定义重写description方法的话.如果方法中包含中文,单独打印数组中的元素可以打印出中文.

        [xwjArray objectAtIndex:1]; // 根据下标来找出元素

        // 判断数组内是否包含某一个对象

    // - (BOOL)containsObject:(ObjectType)anObject;

      BOOL result = [xwjArray componentsJoinedByString:@"你最帅"];

        switch (result) {

            case 0: // 由于BOOL值只返回两个结果,要么0要么非0

                NSLog(@"没有!");

                break;

            default:

                NSLog(@"没有");

                break;

        }

        [xwjArray lastObject]; // 获取数组中最后一个元素

        [xwjArray objectAtIndex:xwjArray.count-1];// 这样也能获取不安全.

        [xwjArray firstObject];// 回去数组元素中第一个元素

        [xwjArray objectAtIndex:0];// 如果下标更改过很可能取到的值不是我们想要的

        // 好了谈了这么多,该说下,如何遍历数组中的元素了

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

        { // 这个是我们最熟悉的普通遍历法

            NSLog(@"%@",xwjArray[i]);

        }

        // 增加for循环

        for(id obj in xwjArray)

        {

            NSLog(@"%@",obj); // 为什么非要用ID?因为数组可以存储任何OC对象,ID不是更加安全吗?

        }

        // 利用Block来遍历系统自带的方法

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

            NSLog(@"%@",obj);

            // obj是对象,idx是下标  stop是停止条件.

            // 下一张的篇幅我准备重点给大伙分析分析Block 不喜勿喷..

        }];

        // 现在来谈下总结吧:NSMutableArrayNSArray的子类,NSArray拥有的所有方法.NSMutableArray,而且还拥有扩展的属性和方法

        // NSArray是不可变数组,所以NSArray创建的对象内部存储的元素不能进行增///但是NSMutableArray可以

        

       NSMutableArray *xwj1Array = [NSMutableArray arrayWithObjects:@"xie",@"wen",@"jian", nil];

        [xwj1Array addObject:@"iloveyou"]; // 新增

        [xwj1Array objectAtIndex:0];// 取出第零个下标

        [xwj1Array removeObjectAtIndex:1]; // 根据下标删除

        // 用数组存储对象的缺点

        // NSArray/NSMutableArray存储元素.如果需要存/取对象,都需要依赖下标

        // 当数组内元素有变动的时候,之前通过下标缺点的一个元素,现在就确定了.

       NSMutableArray *xwj2Array = [NSMutableArray arrayWithObjects:@"",@"",@"",@"",@"", nil];

        [xwj2Array removeObject:0]; // 删除第零个

        [xwj2Array addObject:0]; // 取到零个.

        // 这时候下标已经发生变化了.

        

        

    }

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值