码迷,mamicode.com
首页 > 其他好文 > 详细

024-Foundation框架(下)-OC笔记

时间:2015-10-08 23:06:28      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

学习目标

1.【理解】NSDictionary

2.【了解】NSDictionary的常用方法

3.【掌握】NSDictionary的遍历

4.【理解】NSMutableDictionary

5.【了解】NSFileManager

6.【了解】Foundation常用结构体

7.【了解】NSNumber

8.【了解】NSValue

9.【了解】NSDate

10.【了解】集合的内存管理

11.【了解】copy和mutableCopy

12.【理解】单例模式

一、NSDictionary

NSArray和NSMutableArray存储数据是将每一个元素挨个存储到数组中,但是NSMutableArray如果删除、新增元素后,这个元素后面的元素对应的下标就会发生变化,所以NSMutableArray的缺点是下标不可靠。为此Apple提供了一个新的类NSDictionary来解决这个问题,在存储数据到数组时,为存储到数组中每个元素取一个固定的别名(key)。NSDictionary字典数组一旦创建完毕,其键值对的个数就固定,并且无法删除、新增键值对(不可变字典集合)。特别要注意的是键值对中的值只能是OC对象,键必须要是实现了NSCoping协议的OC对象

存储原理字典中的键值对仍然是以数组的形式存储的,但并不是挨个存储。在往字典集合中存储数据的时候,会将key和数组长度根据哈希算法计算出一个下标。取值的时候,也是将key和数组长度根据哈希算法计算出一个下标,然后根据下标取值。

存的效率:NSArray效率更高。

取的效率:如果把所有数据一次性取出使用NSArray,如果只取出特定的元素使用NSDictionary。

二、NSDictionary的常用方法

 

 

三、NSDictionary的遍历

使用增强for循环遍历字典数组

使用block遍历字典数组

 

四、NSMutableDictionary

NSMutableDictionary是NSDictionary的子类,因为是子类所以用法和NSDictionary差不多。唯一区别就是用NSMutableDictionary创建的字典集合中的元素是可以新增、删除的(可变字典集合)。

 

五、NSFileManager

NSFileManager是Foundation框架提供的一个文件管理类,用来操作磁盘上的文件、目录。这个类的对象是以单例模式(只能有一个对象)创建的。在对文件、目录进行操作之前,建议先判断文件、目录的各种权限再操作。

常见方法之判断

常见方法之获取信息

常见方法之创建文件、目录

常见方法之拷贝、移动、删除

 

六、Foundation常用结构体

在Foundation中定义了很多常用结构体类型来简化我们的日常开发,这些结构体和我们自己定义的结构体没有任何区别。常用的结构体有CGPoint(NSPoint)、CGSize(NSSize)、CGRect(NSRect)等,这几个结构体用于保存IOS界面上控件的位置信息(坐标、大小),并且这几个结构体建议使用CG前缀的,因为跨平台。

CGPoint(NSPoint)保存控件坐标(x、y坐标)

CGSize(NSSize)保存控件大小(长、高)

CGRect(NSRect)保存一个控件的坐标、大小

 

七、NSNumber

NSNumber是Foundation框架中提供的一个包装类,用于将基本数据类型封装为一个对象,然后就可以将这些对象存储到集合中。

 

八、NSValue

NSValue是Foundation框架中提供的一个包装类,专门用于包装CGPoint、CGSize、CGRect、NSRange等结构体为对象,然后就可以将这些对象存储到集合中。如果自己的结构体想要存储到集合中,必须要自己写包装类

自己写包装类示例

 

九、NSDate

NSDate是Foundation框架提供的一个日期处理类,可以获取时间并以各种形式输出。

 

十、集合的内存管理

当我们将一个对象存储到集合之中的时候,会先将这个对象的引用计数器加1。当集合被销毁的时候,就会将集合中存储的对象的引用计数器减1。

绝大多数情况下,Foundation框架中的类,如果是以类名开头的类方法创建出来的,那么这个对象99.999999%的情况下已经被aurorelease过的。特别注意在ARC模式下,数组的指针是一个强类型指针

十一、copy和mutableCopy

copy和mutableCopy都是定义在NSObject类中的方法,用于拷贝对象。copy常作为@property的参数,当@property定义的类型为NSString类型时,无论是在MRC还是ARC下,都使用copy参数。

浅拷贝:指针拷贝(地址),不会产生新对象,但是原对象的引用计数器加1。

深拷贝:内容拷贝,会产生新对象,旧对象的引用计数器不变,新对象的引用计数器为1。

copy方法内部调用了另外一个方法copyWithZone,这个方法定义在NScoping协议中。所以一个对象想要有拷贝能力,就必须遵守这个协议并实现方法。

自定义类要实现copy的方法

 

十二、单例模式

单例模式顾名思义就是一个类在程序中只能实例化一个对象,例如NSFileManager类。我们实例化一个对象,必须调用alloc方法,而alloc方法是调用了allocWithZone:方法。所以我们只需要重写allocWithZone:方法就能让类实现单例模式。那什么时候使用单例模式呢?当类的对象需要被共享的时候我们就可以使用单例模式让对象具有唯一性

让自定义的类实现单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//Person.h文件
#import <Foundation/Foundation.h>
 
@interface Person : NSObject
+(instancetype)sharedPerson;
@end
 
//Person.m文件
#import "Person.h"
 
@implementationPerson
 
//重写allocWithZone:方法
+(instancetype)allocWithZone:(struct_NSZone *)zone{
    //定义一个镜头类型的id指针赋值nil
    staticidinstance=nil;
    //判断这个指针是否为nil
    if(instance==nil){
        //如果为nil就创建对象赋值给id指针
        instance=[super allocWithZone:zone];
    }
    //返回id指针的值
    returninstance;
}
//类方法创建对象
+(instancetype)sharedPerson{
    return[[selfalloc] init];
}
@end
 
//main.m文件
#import <Foundation/Foundation.h>
#import "Person.h"
 
intmain(intargc,constchar*argv[]){
    @autoreleasepool{
        
        Person*p1=[[Personalloc] init];
        Person*p2=[[Personalloc] init];
        Person*p3=[[Personalloc] init];
        
        //调用单例的规范类方法创建对象
        Person*p4=[PersonsharedPerson];
        
        NSLog(@"\np1 = %p\np2 = %p\np3 = %p\np4 = %p",p1,p2,p3,p4);
        /*
         p1 = 0x1002067c0
         p2 = 0x1002067c0
         p3 = 0x1002067c0
         p4 = 0x1002067c0
         */
    }
    
    return0;
}

 

 
 
 

024-Foundation框架(下)-OC笔记

标签:

原文地址:http://www.cnblogs.com/liehuntianshi/p/4862418.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!