Foundation框架|青训营笔记

107 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第2天

主要内容

  • Framework简介

  • Foundation框架

    • NSObject类

    • 数据类型

      • NSString
      • NSArray与NSMutableArray
      • NSDictionary与NSMutableDictionary
  • 个人总结

Framework简介

  • Framework:框架,是一个通用、可复用且具备特定功能的软件或环境。

  • iOS System Frameworks:包括动态代码库、资源文件、头文件等。从底层向上依次为:

    • Core OS(操作系统层):最靠近硬件的框架,常用于直接处理安全事务或和其他设备通讯。
    • Core Services(服务层):提供应用程序所需要的基础系统服务。 Foundation在此层。
    • Media(媒体层):提供包括图形,音频,视频相关的技术支持。
    • Cocoa Touch(触摸层):与界面有关。UIKit在此层。

Foundation框架

Foundation框架为 App和其他框架提供了基础的能力,包括数据存储持久化,文本处理,日期时间计算,排序筛选,还有网络。并且Foundation框架的能力是MacOS, iOS, watchOS, tvOS通用的。

  • Foundation框架的引入(引入伞头文件):import <Foundation/Foundation.h>

NSObject类

NSObject是一个遵守NSObject协议的类,是OC中所有类的根类 (root Class)。

  • NSObject - 分配内存空间 & 初始化:

    • alloc + init:

      MyInterface *willken = [[MyInterface alloc] init];
      

      alloc会返回一个空的实例,init方法会进行初始化。

    • new(与上述方法等价)

      MyInterface *willken = [MyInterface new];
      
  • NSObject - 方法调用:

  • NSObject - 类关系判断

    • 获取当前对象的类:- (Class)class;
    • 判断对象是否是给定类或给定类子类的实例:- (BOOL)isKindOfClass:(Class)aClass;
    • 判断对象是否是给定类的实例:- (BOOL)isMemberOfClass:(Class)aClass;
    • 判断对象是否遵从给定的协议:- (BOOL)conformsToProtocol:(Protocol *)aProtocol;

数据类型

NSString

  • NSString - 创建

    • 直接使用@进行创建:NSString *stringObject = @"hello";

    • 先创建C语言字符串,再将其转换为NSString对象:

      // C语言字符串 -> NSString 对象
      char *cString = "willken";
      NSString *stringObject1 = [NSString stringWithUTF8String:"willken"];
      
    • 初始化空字符串:NSString *stringObject2 = [[NSString alloc] init];

    • 用@初始化:NSString *stringObject3 = [NSString stringWithString:@"hello"];

    • 字符串拼接:NSString *stringObject4 = [stringObject3 stringByAppendingString:@" world"];

  • NSString - 类型转换

    • int转NSString

      int num = 123;
      NSString *stringObject5 = [[NSString alloc]initWithFormat:@"%d , %@", num, "str"];
      
    • NSString转bool:BOOL boolValue = [numberStr boolValue];

    • NSString转int:int intValue = [numberStr intValue];

    • NSString转float:float floatValue = [testStr floatValue];

    • NSString转double:double doubleValue = [testStr doubleValue];

  • NSString - 子字符串

    • 获取字符串长度:NSUInteger length = [stringObject length];

    • 根据索引获取字符:unichar index_char = [stringObject characterAtIndex:0];

    • 截取字符串(从索引位置到结尾):NSString *subStr1 = [stringObject substringFromIndex:1];

    • 截取字符串(从开始到索引位置):NSString *subStr2 = [stringObject substringToIndex:2];

    • 截取字符串(从索引开始取特定长度字符串):

      NSRange range = NSMakeRange(12);
      NSString *subStr3 = [stringObject substringWithRange:range];
      

NSArray与NSMutableArray

NSArray是NSObject子类,类似C/C++中的数组,同时NSArray中存储的是NSObject类。若要存放数字,可将其转为NSNumber类型后再进行存放。NSArray一旦创建后无法更改,不可增删。NSMutableArray可实现增删。

  • NSArray - 创建

    • 空数组

      NSArray *arr1 = [NSArray array];
      NSArray *arr2 = [[NSArray alloc] init];
      
    • 利用@创建数组

      NSArray *arr3 = @[@"iOS", @"Android", @"Server"];
      NSArray *arr4 = [NSArray arrayWithObjects:@"iOS", @"Android", @"Server"];
      
  • NSArray - 查询

    • 返回对应位置的元素:NSObject *obj1 = array[0];
    • 返回元素的对应位置:NSUInteger index = [array indexOfObject:obj1];
    • 判断是否包含指定对象:[array containsObject:str];返回布尔值。
    • 遍历:for (NSString *strObj in array) {...}
    • 数组内元素个数:array.count
  • NSMutableArray - 数据增删

    // 新增对象
    [mutableArrayObject addObject:@"StringObject"];
    [mutableArrayObject insertObject:@(0) atIndex:0];
    [mutableArrayObject addObjectsFromArray:@[@"StringObject", @(1)]];
    ​
    // 移除末尾元素
    [mutableArrayObject removeLastObject];
    // 删除指定下标对应元素
    [mutableArrayObject removeObjectAtIndex:0];
    // 移除全部元素
    [mutableArrayObject removeAllObjects];
    

NSDictionary与NSMutableDictionary

NSDictionary是基于Key-Value键值对访问的数据类型。与NSArray类似,无法增删,可增删的Dictionary是NSMutableDictionary

  • NSDictionary - 创建

    • NSDictionary *dict1 = @{
         @"key1":@"value1",
         @"key2":@"value2"
      };
      
    • NSDictionary *dict5 = [[NSDictionary alloc]initWithObjects:@[@"value1",@"value2"] 
                                                        forKeys:@[@"key1",@"key2"]];
      
  • NSDictionary - 访问

    • 根据key获取value:NSObject *getValue = [dictionary1 objectForKey:@"key1"];id getValueDirect = dictionary1[@"key1"];
    • 获得key合集:NSArray *keysArr = [dictionary1 allKeys];
    • 获得value合集:NSArray *valuesArr = [dictionary1 allValues];
    • 遍历:[dictionary1 enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { NSLog(@"key = %@ value = %@",key,[dictionary1 objectForKey:key]); }];
    • 获取字典中元素个数:[dictionary1 count];
  • NSMutableDictionary - 数据增删

     //改变字典中的key和value
    [mutableDictionary setObject:@"value2" forKey:@"key2"];
    [mutableDictionary setValue:@"value3" forKey:@"key3"];
     mutableDictionary[@"key4"] = @"value4";
     
     //移除某一个key对应的元素
    [mutableDictionary removeObjectForKey:@"key2"];
     //移除所有元素
    [mutableDictionary removeAllObjects];
    

个人总结

本篇笔记重点记录整理了Foundation框架中的NSObject类以及常见的数据类型。重点应该关注数组与字典都会详细分为可变以及不可变两种类型。同时应该重点注意在OC中Array与Dictionary中存放的都是NSObject类,而不是基本变量类型(int,float,long,等),这样的设定保证了NSArray中的对象是等长的,即都是对象指针。以上两点是与C/C++有较大差异的地方,需要重点注意。