Fondation框架


NSString的恒定性

  • 当我们使用简要的创建字符串的时候,也就是使用1个OC字符串常量来初始化字符串指针的时候,这个字符串对象是存储在常量去(数据段)的。 NSString *str = @"jack"

  • 当我么调用NSString的类方法来创建对象的时候,创建的字符串对象是存储在堆区的。

NSString *str = [NSString stringWithFormar:@"jack"];
NSString *str = [NSString new]
  1. 当在内存中创建一个字符串对象以后,这个字符串对象的内容就无法更改。当我们重新为字符串指针初始化值的时候,并不是修改原来的字符串对象,而是重新的创建一个字符串对象,将这个字符串对象的地址重新赋值给字符串指针变量。
  2. 当系统准备要在内存中创建字符串对象的时候,会先检查内存中是否有相同内的字符串对象,如果有,直接指向,没有才会创建。
  3. 存储在常量区的数据不会被回收,所以存储在常量区的字符串对象也不会被回收

NSDictionary与NSMutableDictionary

NSDictionary字典数组(键值)
  1. 创建
        NSDictionary *dict1 = [NSDictionary new];
        NSDictionary *dict2 = [[NSDictionary alloc]init];
        NSDictionary *dict3 = [NSDictionary dictionary];
		//这三种没有数据,也没有意义
		//通常使用
		        NSDictionary *dict4 = [NSDictionary dictionaryWithObjectsAndKeys:@"jack",@"name",nil];
		//简写
        NSDictionary *dict5 = @{@"name":@"rose"}
		//取值
		
  1. 遍历字典数据
  • 字典无法使用下标取
  • 使用for in循环遍历的是键,所以
        for(id item in dict5)
        {
            NSLog(@"%@ = %@",item,dict[item]);
        }
  • 使用block遍历
        [dict5 enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
            NSLog(@"%@ = %@",key,obj);
        }];
  1. 其是通过哈希算法计算出其下标
  2. 什么时候使用
  • 全取用NSArray
  • 指定的几个用字典数组
NSMutableDictionary
  1. 创建与NSDictionary一样,但是不能用简写(因为其是一个字类指针)

结构体

//坐标
CGPonint p1;
//长度和宽度(大小)
CGSize p2;
//坐标和大小 
CGRect p3;
p1.x=20;
p1.y=30;
NSPonint p1 ={20,.y=30};
//函数创建
CGPoint p1 = CGPointMake(20,30);
CGRect rect;
rect.origin =(CGpoint){10,20};
rect.size = (CGSize){100,34};
CGrectMake(10,20,30,40);
//封装成OC对象
NSValue *v1 = [NSValue valueWithPoint:p1];
NSValue *v2 = [NSValue valueWithSize:p2];
NSValue *v3 = [NSValue valueWithRect:p3];
//封装成数组
NSArray *arr = @[v1,v2,v3];

日期

        NSDate *date= [NSDate date];
        //创建日历对象
        NSCalendar *calendar = [NSCalendar currentCalendar];
        //取出日期各部分
        [calendar NSDateComponents *com =components:NSCalendarUnitWeekday|NSCalendarUnitDay fromDate:date];
		NSLog(@"%lu---%lu",com.weekday,com.day)

  1. 无论在MRC还是在ARC下,如果属性的类型是NSString类型的,@Property参数使用copy(没有创建对象,直接返回地址(浅拷贝),不可变字符串。NSMutableString会产生新对象(深拷贝)),不可变字符串。使用mutableCopy是可变字符串。
  2. 字符串对象拷贝的引用计数器的问题
  • 若字符串对象存储在常量区中,存储在常量区的数据不允许回收的,所以存储在常量区的字符串对象的引用计数器是一个超大的数,并且retain和release无效
  • 若字符串存储在堆区,这个字符串对象和普通的对象一样的,引用计数器默认值是1.
  • 字符串对象如果是浅拷贝,原来的对象的引用计数器不变,新拷贝出来的对象的引用计数器为1.
  • 修改字符串时不改变原有字符串
_name = [name copy]
  • 如果我们想要让我们自己的类具有对象拷贝的能力,那么就让我们的类遵守NSCoping协议。并实现copyWithZone:这个方法
  • 如果想要实现深拷贝:那么就重新创建1个镀锡,并将对象的属性的值复制,返回。
  • 如果想要实现浅拷贝,那么就直接返回self

  1. 单例模式:
  • 一个类的对象,无论在何时创建也无论在什么地方创建,也无论创建多少次,创建出来的都是同一个对象。
  1. 无论如何创建对象,最终都会调用alloc方法来创建对象。
  • alloc方法的内部,其实什么都没有做,只是调用类的allocWithZone方法
  1. 实现单例
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    static id instance =nil;
    if(instance ==nil)
    {
        instance =[super allocWithZone:zone];
    }
    return instance;
}
  1. 单例模式的规范:
  • 如果类是一个单例模式,要求为类提供一个类方法,来返回这个单例对象。类方法的名称必须以shared类名;default类名
+(instancetype)sharedPerson
{
    return [self new];
}
+(instancetype)defaultPerson;
{
    return [self new];
}
  1. 什么时候使用单例模式
  • 特点:共享(访问的都是同一对象),
学习