Objective-C基础学习笔记(九)-Foundation

一.Foundation框架简介

 伟大的苹果公司提供了很多可以在应用程序里调用的框架。要使用一个框架,需要将它添加到你的项目中,你的项目才可以使用它。Foundation框架为所有的应用程序提供基本系统服务你的应用程序,具体可以干什么呢?

    使用Foundation可以:

  • 创建和管理集合,比如数组和字典
  • 访问存储在应用程序里的图片和其它资源
  • 创建和管理字符串
  • 提交和接收通知
  • 创建日期和时间对象
  • 自动发现IP网络上的设备
  • 操作URL流
  • 执行异步代码
二.Foundation框架中一些结构体

NSRange 结构体

1.   NSRange 这个结构体的成员和定义如下:

<span style="font-size:14px;"> typedef struct _NSRange {
    NSUInteger location;  // 位置
    NSUInteger length;    // 长度
 } NSRange;
</span>

2.作用:通过它的两个成员变量可以知道,NSrange能够表示一个范围从location位置开始的length长度; 例如:

1) 表示 love在字符串@"i love oc"中的位置则:location = 2; length = 4; 

2)56,78,89这三组数据在数组中{10,18,56,78,89}的范围; location = 2; length = 3

3. 得到NSRange 这个结构体的两种常见方式为

1)直接创建: NSRange r2= NSMakeRange(2,4);

2)通过字符串的rangeOfString:方法可返回某子串在母串在母串中的位置,这种方法如果找不到

length = 0 

location = NSNotFound-1

4.NSRange使用示例:

int main()
{
    
    /* NSRange结构体的创建 */
    NSRange r2 = NSMakeRange(2,4);// (掌握)方式常用
    NSLog(@"loc %lu ,length %lu",r2.location,r2.length); 2 4
    
    /* 查找ve o 在str中的位置 */
    NSString *str = @"i love oc";
    // 如果找不到length = 0 location = NSNotFound 即-1
    NSRange r3 = [str rangeOfString:@"ve o"];
    
    NSLog(@"loc %lu ,length %lu",r3.location,r3.length);// 4 4
    

    return 0;
}</span>

2015-03-24 10:33:43.697 Foundation框架-结构体[496:21768] loc 2 ,length 4

2015-03-24 10:33:43.699 Foundation框架-结构体[496:21768] loc 4 ,length 4

NSPoint\CGPoint结构体

1.定义如下:

# define CGFLOAT_TYPE double
 struct CGPoint {
    CGFloat x; //double类型
    CGFloat y;
 };
 typedef struct CGPoint CGPoint;
 typedef CGPoint NSPoint;</span>

2.NSPoint\CGPoint是一样呢,可用于表示一个位置坐标

3.常用的设定位置的方法:

CGPoint point = CGPointMake(20, 20); //开发中最常用

CGPoint p1 =NSMakePoint(10,10);

4.CGPointZero == CGPointMake(0,0);

5. 判断两个点是否相等的方法

BOOL p =  CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));
 返回值是BOOL类型</span>


NSSize\CGSize结构体

1. 定义如下:

struct CGSize {
 CGFloat width;
 CGFloat height;
 };
 typedef struct CGSize CGSize;</span>
2. 作用,可用于表示一个矩形,一个元素占用屏幕的范围

3.常用的设定范围的方法: CGSize size = CGSizeMake(100, 200);
4. CGSizeZero==  CGSizeMake(0, 0);

5.判断两个size是否相等的方法

BOOL s = CGSizeEqualToSize(CGSizeMake(100, 200), CGSizeMake(100, 200));</span>

 NSRect\CGRect

1.定义如下:

struct CGRect {
 CGPoint origin;
 CGSize size;
 };
 typedef struct CGRect CGRect;</span>
2.作用,这个结构体涵盖了,基本位置的点和占用屏幕的大小,就可确定这个元素在屏幕的具体位置和范围,确切的说可以表示一个矩形

3.常用的设定结构体值的方法

    CGRect r1 = CGRectMake(0, 2, 100, 200);
    CGRect r2 = NSMakeRect(2, 1, 200, 100);
    CGRect r3 = {{0,0},{100,200}};
    CGRect r4 = {p1,s1};//直接使用点结构体和size结构体变量</span>


4.判断一个矩形是否包含了某点的方法

BOOL r = CGRectContainsPoint(CGRectMake(0, 0, 100, 200), CGPointMake(100, 201));</span>


5. 开发过程中经常要查看几个结构的值,一般都转化为字符串:

// 开发中经常查看:常规做法将所有数据转化为字符串
    NSString *str = NSStringFromPoint(p1);
    NSString *str1 = NSStringFromSize(s1);
    NSString *str2 = NSStringFromRect(r1);
    NSLog(@"p1:%@",str);
    NSLog(@"s1: %@",str1);
    NSLog(@"r1: %@",str2);
    </span>

三 .NSString类

NSString :不可变字符串

1. 创建字符串的一些方法:

int main()
{
      /* 字符串的创建方式1 @"" */
      NSString *str = @"hello ";
      /* 字符串的创建方式2 类方法 + initWithFormat*/
      NSString *str1 = [[NSString alloc] initWithFormat:@"hello %d",10];
    
      /* 字符串的创建方式3  C字符串转OC字符串 */
      NSString *str2 = [[NSString alloc] initWithUTF8String:"jack"];
    
      /* OC 转 C */
      const char *str3 = [str2 UTF8String];
    
      /* 字符串的创建方式4:本地路径文件使用 */
      /* 从文件中读取字符串 涉及到中文就用encoding:NSUTF8StringEncoding */
      NSString *str4 = [[NSString alloc] initWithContentsOfFile:@"/Users/niko/Desktop/ios/test/infile.txt" encoding:NS                       UTF8StringEncoding error:nil];
      NSLog(@"%@",str4);
    
    /* 字符串的创建方式5:资源路径文件使用 */
    // URL :资源路径 格式:协议头://路径
    
    // 本地资源:file://
    NSURL *urlLocal=[[NSURL alloc] initWithString:@"file:///Users/niko/Desktop/ios/test/infile.txt"];
    
    // 网络资源)http://weibo.com/a.png
    NSURL *urlNet=[[NSURL alloc] initWithString:@"http://www.baidu.com"];
    
    /* 不带头的本地文件路径的本地资源*/
    NSURL *urlFile = [NSURL fileURLWithPath:@"/Users/niko/Desktop/ios/test/infile.txt"];
    /* 使用资源创建字符串 */
    NSString *str5 = [[NSString alloc] initWithContentsOfURL:urlFile  encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"str5  %@",str5);
    
     开发中经常用这种类方法创建字符串
     一般都会有个类方法和对象方法配对,例如有initwithxxx(对象方法)就有stringWithxxx (类方法)
     
    [NSString stringWithFormat:@""];
     
    [NSString stringWithContentsOfFile:(NSString *) encoding:(NSStringEncoding) error:NSError *)];

    
    [NSString stringWithContentsOfURL:(NSURL *) encoding:(NSStringEncoding) error:(NSError *__autoreleasing *)];
     
    [NSURL URLWithString:(NSString *)];
     
    
    return 0;
}</span>

2. 将字符串导入到文件的方法:

int string_export()
{
    //atomically---安全:写失败不会创建
    
    /* 字符串导出到文件方法1:writeToFile*/
    [@"niko \n wirte" writeToFile:@"/Users/niko/Desktop/ios/test/infile.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
 
    /* 字符串导出到文件方法2 writeToURL:*/
    NSString *str = @"1234567";
    NSURL *url = [NSURL fileURLWithPath:@"/Users/niko/Desktop/ios/test/infile.txt"];
    
    [str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
    return 0;
}

 NSMutableString不可变字符串:

可变字符串,就是字符串创建之后可以改写,可删除可添加新字符的字符串。反之上面的NSString创建的字符串就是不可变的,创建之后不能对原有的字符串进行增删改操作。

常用的操作方法:

NSMutableString *s1 = [NSMutableString stringWithFormat:@"hello i am mutale %d",100];
    /* s1是可变的 可往里面加东西,在原基础上加的不会反回新的 */
    [s1 appendString:@" apend "];
    
    /* 也可以删除某个范围的字符 am */
    /* 下面这种方法常用 先找到要删除字符的范围,再利用delete去删*/
    //[s1 deleteCharactersInRange:NSMakeRange(8, 2)];
    
     NSRange r1 =[s1 rangeOfString:@"am"];
    [s1 deleteCharactersInRange:r1];
    
    /*stringByAppendingString:方法在原有基础上拼接出一个新的,但并不会影响原有的字符串 
      返回值是不可变字符串*/
    NSString *s2 = [NSString stringWithFormat:@"hello i am not mutable"];
    NSString *s3 = [s2 stringByAppendingString:@"I am appeding"];
    NSLog(@"s1 = %@ \ns2= %@ \ns3=%@",s1,s2,s3);
    return 0;

2015-03-24 11:26:34.824 NSString[539:35702] s1 = hello i  mutale 100 apend  

s2= hello iam not mutable 

s3=hello iam not mutablehahhaha


四. NSArray 与 SMutableArray数组

OC数组只能存放OC对象,正常情况下不能存放非Oc对象如int char等类型。

NSArray 不可变数组,创建之后元素个数等都不能改变:

NSArray数组的几种创建方式:

int  NSArray_init()
{
    //1. 创建一个空数组:永远是空数组后面不能在添加了
    NSArray *array1 = [NSArray array];
    
    //2. 创建初始为一个元素的数组 arrayWithObject:
    NSArray *array3 = [NSArray arrayWithObject:@"mike"];
    
    //3.创建初始为n多个对象的数组 arrayWithObjects
    // arrayWithObjects方法后面必须加nil结束,nil是数组结束的标记,
    NSArray *array2 = [NSArray arrayWithObjects:@"jack",@"niko",nil];
    
    //4.开发中快速创建数组 返回值是NSArray *不可变数组 */
    NSArray *array4 =@[@"jack",@"niko",@"moki"];

数组中元素个数的访问:get方法,成员变量count

    // 数组元素个数
    NSLog(@"array %ld",array2.count);
数组中元素的访问的方法两种:

    // 数组元素的访问方式1 根据位置访问
    NSLog(@"array2[1] %@",[array2 objectAtIndex:1]);
    
    // 数组元素的访问方式2 和C数组一样,array2[0]这是编译特性,编译器帮我们改写了
    NSLog(@"array2[0] %@",array2[0]);

数组中元素遍历的四种方法:
int main()
{
    /* 1. 最粗暴直接的数组遍历 */
    NSLog(@"%@",array);
    
    /* 2. for循环慢速遍历 */
    for (int i = 0;i < array.count;i++)
    {
        NSLog(@"%d --- %@",i,array[i]);
    }
    
    /* 3.开发中快速遍历数组: 缺点不知道第几次
     方法一:加 i计数
     方法二:使用indexOfObjectint返回位置
     */
    for (id obj in array5)
    {
        // 找到obj元素在数组中的位置
        NSUInteger i = [array5 indexOfObject:obj];
        NSLog(@"%ld -- %@",i,obj);
        /* 退出循环:*/
        if(i == 0)
        {
            break; //这种方式退出
        }
        
    }
    /* 4. enumerateObjectsUsingBlockBLock 参数为block 代码块
         将当前元素和索引位置当做参数歘传给block ,stop用来停止遍历的 */
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%ld -- %@",idx,obj);
        /* 怎么退出循环 */
        if(idx == 5)
        {
            // stop为什么是指针呢?传指针可改变里面的值
            *stop = YES; //停止
        }
        
    }];
    
    return 0;
}

NSMutableArray:可变数组

可变数组相比不可变数组,他能删除添加元素:

可变数组的创建:

    /* 可变数组的创建 */
    // @[]只创建不可变数组,返回值是NSArray
    // 1.创建初始化为空的可变数组
    NSMutableArray *marray = [[NSMutableArray alloc] init];
    
    // 2.创建初始不为空的数组  arrayWithObjects方法后面必须加nil结束
    NSMutableArray *marray = [NSMutableArray arrayWithObjects:@"kimi",@"kate", nil];

可变数组的添加元素方法:

    /*  添加元素 */
    // 1.正规的添加元素:- (void)addObject:(id)anObject;
    [marray addObject:[[Person alloc] init]];
    
    // 2.最直接的,编译器帮我们做
    marray[marray.count] = @"hello";
    
    
    // 3. OC数组只能存放OC对象,不能存放非Oc对象如int char,想要放就得另想办法
    //[marray addObject:15];
    //[marray addObject:nil];
可变数组的删除元素方法:

    /* 删除元素 */    
    // 1.删除指定元素
    [marray removeObject:@"hello"];

    // 2.根据位置删除元素
    [marray removeObjectAtIndex:0];

    // 3.删除所有元素
    [marray removeAllObjects];

可变数组的遍历同不可变数组相同。
五.  NSSet 与  NSMutableSet

1.NSSet :既然作为集合就能存放很多对象,这是集合的特性.

2.NSSetNSArray:

 共同点:

 1>> 都是集合,都能存放OC对象

 2>> 只能存放OC对象,不能存放非OC类对象类型(基本数据类型)

 3>> 本身不可变,都有一个可变的子类

 不同点

 NSArray:有序

 NSSet:无序

3. NSSet的创建与初始化


    // 1. 初始化空的set
    NSSet *s1 = [NSSet set];
    // 2. 初始化一个对象的set
    NSSet *s2 = [NSSet setWithObject:@"hello"];
    // 3. 初始化多个个对象的set
    NSSet *s3 = [NSSet setWithObjects:@"jimi",@"kate",nil];

4.从set中随机拿出一个元素,无序的随机的。

    /* 随机拿出一个元素 */
    NSString *str = [s1 anyObject];

5. NSMutableSet的操作:

    // 创建 初始化
    NSMutableSet *s = [NSMutableSet set];
    //添加元素
    [s addObject:@"hhh"];
    
    //删除元素
    [s removeObject:@"hhh"];

六. 字典 NSDictionary\NSMutableDictionary:

1. 字典作用: 通过一个key找到一个值,  key---->value

2. 字典的创建

    /* 字典的键值对是没有顺序的 */
    /* 一个key 只能对应一个值,后面的覆盖前面的 */
    /* 允许不同的key对应同样的值 */
    // 1. 第一种创建方法
    NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"j"];
    
    // 2. 第二种创建方法 直接输入Key 和 值 的数组
    NSArray *keys = @[@"a",@"b",@"c",@"d"];
    NSArray *objs = @[@"after",@"boy",@"cool",@"duang"];
    NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:objs forKeys:keys];
    
    // 3. 第三种创建方法不常用,有更简单的见方法四
    NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:
                           @"come on",@"c",
                           @"duangguang",@"d",
                           @"effective",@"e",
                           @"fuck",@"f",
                           @"global",@"g",nil
                          ];
   // 4.直接大括号的形式
    NSDictionary *dict4 = @{@"c":@"come on",@"d":@"duang"};
    
    // 5. 直接创建一个空的
    NSDictionary *dict5 = [NSDictionary dictionary];

3.字典元素的访问

    /* 字典对象的查看  */
    id obj = [dict6 objectForKey:@"c"];
    /* 开发中常用这种*/
    id obj = dict3[@"c"]; // 编译器帮我们做好了装换,装换成上一步的代码

4.字典中键值对的个数

   // 返回的是键值对的个数
    NSLog(@"%ld",dict2.count);

5. 可变字典NSMutableDictionary:

1)可变字典的操作:创建、添加、删除;

    //1. 创建一个空的可变字典
    NSMutableDictionary *mdict =[NSMutableDictionary dictionary];
    
    /* 添加键值对 */
    [mdict setObject:@"come" forKey:@"c"];
    [mdict setObject:@"duang" forKey:@"d"];
    
    /* 移除键值对 */
    [mdict removeObjectForKey:@"c"];

    
   /*可变数组不能使用大括号创建
    NSMutableDictionary *mdict2 = @{@"c":@"jack"};
    [mdict setObject:@"ending" forKey:@"e"];
    NSLog(@"%ld",mdict2.count);
    */
    /* 可变字典的遍历 */
    [mdict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@---%@",key,obj);
    }];








  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值