- .h(头文件) .m(源文件c、oc) .mm(源文件c、oc、c++)
- gcc -c -o 汇编
- -framework Foundation链接 NS开头
- 字符串对象加@
- oc中完全兼容c的函数库
- NSLog可以自动换行,并且提供文件名编译时间等
- 需要包含头文件,每一个框架都有一个主头文件,其名字和主头文件相同,主头文件包含了这个框架的所有头文件。
- #import可以自动防止头文件重复包含。
- 链接时,需要手动连接框架。
10.多文件编译:所有对象都是以指针形式存在;跟c类似。编写.m源文件,编译-c -o,链接 -o -framework Foundation
11.%@字符串占位符。int %i,, short int %hi,,,float %f %e,,,double %f
12.*.m 所有.m一块编译
13.面向对象
14.可扩展性比较好,类,抽象的,对象,具体的,实例对象。
15.类名,大写首字母,静态属性,动态行为
16.oc弱语法
17.类外不能直接引用成员变量。
18.对象方法只能通过对象调用,函数直接调用。
19.对象方法内部可以直接引用成员变量,而函数不能直接通过函数名来引用成员变量。
20.冒号也是方法的一部分;不能有重名的方法
21.BOOL char本质,%d %i 打印 返回值1 0
22.命名规范:驼峰标示,不要缩写,注释,名称尽量写全。空格。类型名首字母大写。
23.三大特点:封装Encapsulation,继承Inheritance,多态Polymorphism
24.封装:成员的访问空间,get set方法
25.set方法,给外界提供一个方法可以设置实例变量的值。对传入的值进行过滤,保证内部的的逻辑是正确的。以set开头,set后接实例变量的名称,并且实例变首字母大写,返回值是void。一定要有一个参数,类型与实例变量一致。
26.get方法:返回某个对象的实例变量的值。肯定要有返回值,返回值类型和实例变量类型一致。不要以get开头,名称就是实例变量的名。不需要参数。
27.new创建空间,赋初值为零。
28.成员变量必须以下划线开头。让成员变量和方法名进行区分。可以和局部变量进行区分
29.看到以下划线开头的就知道是类的成员变量。
30.对象方法:-开头。必须以实例变量对象调用。
31.类方法:+开头。以类名调用。类方法不依赖于实例对象存在。
32.类方法和对象方法可以同名。类方法中不能访问实例变量。对象 可以调用类方法。
33.工具类:没有实例变量,方法为类方法,只表示一些 动作的类。
34.类方法的优点和使用场合:不依赖于实例对象,执行效率高。在实际开发中优先使用类方法。当方法不需要使用成员变量时,使用类方法。
35.self指针,指向当前调用这个方法的实例变量,当局部变量和成员变量重名,可以用self区分。
36.在方法中可以用[self 方法名]来调用本对象的其他方法,实现代码复用。方法中不能用self调用当前方法,会引发死循环!
37.self出现在类方法中,self指向当前的类(类对象)。类方法中的self指向类对象,对象方法中的self指向实例对象
38.在类方法中不能通过self调用对象方法,在对象方法中,也不能用self调用类方法。
39.在类方法和对象方法中都不能通过self调用普通函数。
40.self只能出现在方法中,是方法的一个隐藏指针。
41.继承 子类名 :父类名
42.建立类与类之间的关系。把重复代码抽取出来建立父类,子类继承父类的所有方法和属性。
43.NSObject类:是所有类的父类。里面声明和定义了一些常用的方法,因此oc自定义的类必须继承自NSObject类。
44.子类可以重写父类的方法,必须和父类方法原型完全一致,调用时,先从当前对象中寻找。子类找不到,去父类中去找。
45.子类不能定义和父类中相同的成员变量。
46.子类指针superclass指向父类。
47.继承的缺点:
48.父类和子类关系紧密,耦合性太强,子类不能单独存在。
49.继承中的self
50.在子类方法中使用self调用其他方法时,如果子类重写了方法,则调用子类方法,如果没写,则调用父类方法。
51.super当子类想保留父类的一些行为,子类方法中强制调用父类方法。
52.一个类只能继承一个父类。
53.继承is a 组合have a Score *_score
54.多态:一种类型,多种表现形态,oc中表现为,父类指针可以指向父类对象,也可以指向子类对象。
55.直到程序运行期,才能根据父类指针实际指向对象来确定调用父类方法还是子类重写的方法。
56.多态条件:1,要有继承关系。2,子类重写方法。3,父类指针指向子类对象。
57.好处:程序的可扩展性和可维护性增强。
58.限制:父类指针不能指向子类新增的方法。
59.动态绑定
60.字符串对象NSString。
61.判断两个字符串是否相等:[self.name isEqualToString:name2]。
62.数字转化为字符:NSString *str = [NSString stringWithFormat:@“%i%i”, age, no]。
63.#pragma mark
64.#pragma mark - 分组。
65.点语法
66.1,目的:让学过其他语言的程序员快速熟悉oc的语法。
67.2,本质:调用相关的方法,不是访问成员变量,是一种编译器行为。会根据是否赋值来判断是调用setter还是调用getter。必须有setter和getter才能使用点语法。
68.自己调用自己,有可能会死循环。
69.成员变量作用域:权限修饰符。
[email protected]自己类的对象方法中。
[email protected]自己类,子类的对象方法中访问。如果没写权限修饰符,默认是@protected
[email protected]同一个项目,任何地方。
73.实现中定义成员变量,对编译器是不可见的,默认私有,@private,加@public也没用。实现中不能定义声明中的同名实例变量。
74.写在main前面再加@public是可以用的。
[email protected] int age 不能写下划线。自动生成_age的setter和getter声明
[email protected] age = _age;写下划线。自动生成setter和getter的实现。
77.如果没写成员变量,@synthesize自动在@implementation 和@end之间生成私有的。
78.Xcode4.4 以后,只要@property int age 就行了,私有的。帮你生成另一个,如果你手动实现两个,不会帮你生成成员变量。
[email protected] Student头文件中使用。但不知道其中的方法和成员变量。
[email protected] Classes 源文件中使用 #import “Student.h”,全部内容包含。避免了循环引用产生的嵌套包含。如果都包含了一个头文件,一个修改,其他也要修改,引用@class就不用。
81.通用指针类型,相当于NSObject * id类型不能使用点语法,运行时会根据实际指向的对象来实现多态。不要滥用id类型,能确定的类型尽量确定类型,不受静态类型限制,可以调用子类新增方法。
82.构造方法:init构造方法;为了更灵活的初始化实例对象,从此不再用 new,用alloc和构造方法组合。
83.alloc分配存储空间,类方法 +alloc,init把这个存储空间清零,初始化,对象方法-init。
84.重写init方法:
85.是一个对象方法,方法名叫init,返回是id类型,经过初始化的当前对象,一定要先调父类的init方法,用来初始化父类继承过来的对 象。[super init]成功,才有必要初始化子类。
86.继承的时候,父类已经初始化过的成员变量,子类不用再重写。
87.带参数的构造方法:基本跟不带参数的构造方法要求相同,一定以init开头。
88.调用父类已有的构造方法进行初始化,可扩展性比较好,这是面向对象编程思想的体现;如父类改变,子类不需要有任何改变。
89.类的本质:类也是一个对象,叫做类对象 ,是Class类型的。类对象没有成员变量。Class 没有星。
90.获取类对象的方式,通过实例对象调用 -class,通过类名调用 +class。所有使用类名的地方,都可以用类对象代替。
91.类的加载和初始化过程:当程序启动的时候,会加载当前项目中所有的类,加载完成自动调用+load方法,而且只调用一次。
92.类的初始化: initialize,在第一次使用某个类时,就会调用当前类的+initialize方法,而且只调用一次。
93.先加载父类,再初始化子类,先初始化父类,再初始化子类。
94.discription
95.-(NSString *)discription;+(NSString *)discription
96.输出实例对象:类名和地址。用%@ p
97.当用实例对象调用,会调用-开头的。如果不想要按默认输出,则重写discription方法,按照格式拼接成一个字符串。
98.输出类名(没有地址了):+的discription方法。
99.实例对象和类对象的打印方式:
- 实例对象的内存地址 %p p, 指针变量的内存地址%p &p, 调用-discription方法%@ p。
- 类对象的内存地址%p [p class] , %p [Person class] , 调用+discription方法%@ [p class]。
- 封装SEL的目的,可以通过两种方法来调用方法。
- 1,方法名调用。
- 2,传SEL类型的数据去找方法的入口地址,间接调用方法
- 3,无参,一个s参数,两个参数
- 4,[p respondToSelector:@selector(test)]验证是否有这个方法;程序的健壮性更好一点。
- 此方法一般用在私有方法中,如果有才去调用。
- 5,再.h中没有,再.m文件中才有的叫做私有方法。
- 6,当我们只知道方法名,可以用一个函数把方法名转换成SEL数据类型
- NSString *name = @“test:”;
- SEL s = NSSelectorFromString(name);
- [p perfomSelector:s withObiect:@“suibian”]。
- block块,数据类型,
- 与函数的相同点:1,都可以保存一段代码,2,都可以有形参,。
- 与函数的区别:1,函数在程序运行之前就已经确定,而block在函数运行期可以灵活的封装一段代码,能够让系统分配给其他处理器或者其他线程执行,2,函数定义在函数或方法外部,block定义在函数或方法内部;3,局部变量block内部可以访问,(默认)不能修改。加一个关键字__block int a = 5;此时可以修改。
- 4,用typedef int (^MyBlock) (int,int)简化代码3,都可以有返回值
- 延迟两秒调用。[p performSelector:s1 withObject:(NSString *)name afterDelay:2] 程序保持运行状态(main函数的最后),不会退出。[[NSRunLoop currentRunLoop] run] 单例模式。
- Category分类
- 格式:原类(分类名) 原类名+分类名(文件中)
- 1,不改变原来类的基础上,增加一些方法;
- 2,只能增加方法,不能增加属性;
- 3,可以访问原来的成员变量;
- 4,分类可以重写原类的方法,原方法将会被覆盖掉,再也没有办法调用,因此有一定风险。不建议重写原方法。
- 5,分类》原类》父类
- 6,两个分类拥有相同方法时,执行后编译的那一个。
- 7,分类的好处,是一个庞大的类可以分模块进行,使一个庞大的类可以多人开发,更利于团队合作。
- 命名规则:以模块功能来命名,不以作者名来命名。
- 查看第i个字母:
- NSUInteger i;
- unichar c =[c characterAtIndex:i]调用c的地i个字母,返回值是unichar
- 延展:extension
- 1,在类的实现文件中,声明所有私有方法,声明形式(格式)跟分类一样,实现可以直接写在下面的实现中,也可以单独实现。
- 2,作用,使程序更清晰,更规范。
- 3,按照功能进行划分,定义不同的延展,分别声明私有方法。
- 4,延展名可以省略。
- 5,延展也可以写在.h文件里面,方法变为公有方法。目的,将类的方法按照功能进行分类,方便阅读和查找。
- 6,原类名_分类名(文件中)
- 7,Foundation框架中经常使用。
- 私有方法一般以下划线开头,为了区分共有方法
- 定时器:NSTimer,时间间隔,userInfo可以传递一些参数,通过timer.userInfo:来获取。是否重复执行
- [NSTimer scheduleTimeWithTimeInterval:2 target:(id)self selector: (SEL)@selector(test) userInfo: (id)任何oc对象,可空nil repeats:(BOOL)YES]
- 返回值NSTimer *timer
- 定时器关闭(传参NSSTimer *类型的,也可以不带):NSTimer *timer;[timer invlidate];
- 作用:创建一个定时器对象,启动了一个定时器任务,runloop的作用:起到调度作用,会每隔一定的时间间隔通知定时器,让他去执行定时器方法。
- 协议:protocol
- 1,协议只有一堆声明,没有实现,在其他类中实现。也不能出现成员变量。<协议名>
- 2,可以有多个类同时遵守一个协议。
- 3,@required必须要求实现,不实现会有警告(默认)@optional,可选择的,实不实现都行。主要用于程序员之间的交流。
- 4,父类遵守这个协议,则子类也遵守了这个协议
- 5,一个类可以遵守多个协议。<协议1,协议2>
- 6,一个协议还可以遵守另外一个协议
- 7,<NSObject>基协议,所有的新协议都要遵守基协议。有一个类也叫NSObject,基类,它也遵守了基协议。
- 8,某个遵守协议的实例对象的定义方法。
- Student<MyProtocol> *s = [[Student alloc] init];
- 9,某个成员变量(对象类型)也能限定遵守某个协议。
- 10,如果协议只有一个类遵守,可以直接写在这个类的声明中,不用另外再建一个头文件。
- 代理设计模式 Design pattern(设计模式) 实例对象和实例对象间如何通信
- 内存管理
- 1,需要我们手动内存管理的是放在堆区的实例对象
- 2,引用计数器,每个实例对象都有,int型,纪录被引用的次数。当他为零时,对象内存被回收。要是一直不回收,直到程序结束。
- 3,retain +1 返回(id)一个+1以后的当前对象,[p retain] p是指针,但不能起死回生。release -1,无返回值。retainCount %lu 被引用次数。
- 4,- (void)dealloc方法,当任何一个实例对象被释放的时候(准确来说是释放之前)都会自动调用此方法,如果要重写dealloc方法,最后必须要有[super dealloc];
- 5,僵尸对象:所占用内存已经被释放的对象,不能给他发送任何消息。
- 野指针:指向僵尸对象(不可用内存)的指针。
- 空指针:没有任何指向对象的指针(nil, Nil, NULL)oc中不存在空指针错误,给空指针发送消息,不会报错,但也不会做任何事。
- 6,内存管理原则:用就加一,不用就减一。谁加一谁就减一;
- 相关参数:
- assign:直接赋值(默认)
- retain:release旧值,retain新值(只适用于oc对象)
- copy:release旧值,copy新值;
- readwrite:(默认)setter getter
- readonly:getter
- 循环引用,一端用assign,一段用retain。(ARC状态下)retain 换为strong ,assign 换为weak
- 多线程管理
- nonatomic:生成setter时,多线程不加锁;
- atomic:多线程加互斥锁(默认)
- getter= 自定义的getter方法名称;
- setter= 自定义的setter方法名称;
- 改名之后,点语法还是能用的,直接调用就不行了。一般用在BOOL类型的;
- 一个成员可以有多个属性,但是不能冲突。
- autorelease
- 1,autorelease:半自动释放,将一个对象放入自动释放池,池子销毁时才释放,返回id类型,经过autorelease以后的实例对象,引用计数器不会改变。
- 2,autoreleasepool:自动释放池,可以嵌套,可以无限多个,实例对象的寿命周期和所在的池子生命周期相等。
- 3,自动释放池以栈的方式存储,先入后出,对象会放入栈顶的自动释放池。
- 4,常见错误:用了autorelease就不要再用release了,也不要用多次autorelease。
- 5,使用者不用再关心释放的时机问题了。也不用关心何时调release了。
- 6,不会及时的释放,占用内存较大的对象最好不要用。占用内存时间较长。
- 7,系统自带的方法中,没有包含alloc new copy,说明返回的对象都是经过了autorelease不需要再release了。
- 8,oc总不允许出现类名相同的类,用前缀去区分。
- 9,实际来发中,会提供一些类方法,快速创建一个经过autorelease的对象,创建时不要直接用类名,用self,好处是用一个方法既可以创建父类对象,又可以创建子类对象。
- ARC
- 1,编译器特性,自动生成release代码
- 2,还会调用dealloc,如果重写,不用再调用[super dealloc]
- 3,如果没有强指针指向实例对象,ARC自动释放
- 4,(默认情况下)所有指针都是强指针__strong 如:__strong Person *p = [Person new];当p不再指向他,或者p被销毁时,当前对象就被销毁;
- 5,弱指针__weak,如果弱指针指向的实例对象被释放了,弱指针自动为nil。
- 6,retain 换为strong(oc对象类型),assign 仍然用assign,不换为weak;因为weak只适用于oc对象类型。assign适用于非oc对象指针类型。
- 7,不允许调用手动管理内存的方法,如retainCount,autorelease等。
- 8,转换是否适用ARC -fno-objc-arc。
- NSObject基类:
- 1,常用方法:[p1 isEqualTo:p2]返回BOOL,判断两个指针是否指向同一个对象。其实可以(p1 = p2)
- 2,isMemberOf:[p isMemberOfClass:[Person class]]判断p是不是Person类创建的,只会判断是不是当前类,不能判断父类。
- 3,isKindOf:可以判断,是否派生自某一个类,如NSObject。
- 常见结构体
- NSRange 范围location length 如:{1,2,3,4,5} 5就是location:4 length:1
- NSRange range = {4, 1};
- NSRange range = {.location=4, .length=1};
- NSRange range = NSMakeRange(4, 1);
- 查找字符串在另一个字符串中的位置,如果这个字符串没有,长度返回零,location = NSMAX(非常大)
- 把结构体变量转成一个oc字符串对象(这是一个函数)NSString *str = NSStringFromRange(r)
- 查找字符串的位置:NSRange range = [str rangeOfString:@“love”];
- NSPoint /CGPoint 用来表示一个点,跨平台的
- NSPoint p1 = NSMakePoint(10,20);
- CGPoint p2 = CGPointMake(34, 23);
- NSString *str = NSStringFromPoint(p1)
- 原点:CGPointZero
- NSSize/CGSize表示尺寸
- CGSize s1 = CGSizeMake(10,100)
- 宽weight(左右),长height
- NSRect/CGRect表示一个UI元素,包含起始点和尺寸
- CGRect c = CGRectMake(1, 2, 20, 30)
- CGRect c = CGRectMake{p1, s1}。
- 比较两个点是不是同一个点
- BOOL b = CGPointEqualToPoint(p1, p2);
- 判断某个rect是否包含某个点
- BOOL b = CGRectContainsPoint(c1, p1);
- NSString不可变字符串:NSString *s1 = @“qwe”;
- 不常用:NSString *s2 = [[NSString alloc] [email protected]“qwe”]
- 不常用:NSString *s3 = [NSString stringWithString:@“qwe”]
- NSString *str = [NSString stringWithFormat:@“%i%i”, age, no]
- 把c语言的字符串转换成oc字符串:NSString *s4 = [NSString stringWithCString:”hello章三” encoding:NSUTF8StringEncoding];UTF8中文解码用的。
- 把c语言的字符串转换成oc字符串:const char *c = [s4 UTF8String]。
- 读取文件
- NSString *s5 = [NSString stringWithContentOfFile: @“绝对路径” ending:
- NSUTF8StringEncoding error:nil]。
- 从网上获取资源存储的内容,这种方法即适合本地文件,也适合读取网络资源
- 协议头://路径
- 网络文件 http://
- 本地文件 file://
- ftp ftp://
- NSURL*url = [NSURL URLWithString:@“file:///Users/Silver/Desktop/1.txt”]。
- NSString * s6=[NSString stringWithContentOfURL:url ending:NSUTF8StringEncoding error:nil]。
- 把字符串导出到文件:[str writeToFile: @“绝对路径” atomically:(BOOL) ending:NSUTF8StringEncoding error:nil]。
- 把字符串导出到网络:[str writeToURL: url atomically:(BOOL)YES ending:NSUTF8StringEncoding error:nil]。
- [s1 isEqualToString:s2]大小写敏感,只能判断是否相同。
- [si caseInsensitiveCompare:s2]大小写不敏感,返回值不是BOOL类型。
- NSComparisonResult类型的返回值;
- NSOrderedSame相同
- NSOrderedAscending升序
- NSOrderedDecending降序
- [s1 compare:s2]区分大小写的升降序比较
- 获取字符串中字符的个数:[s1 length] 或s1.length。返回值也是NSUInteger类型,lu(long)。一个中文文字就是一个字符。
- 查看第i个字母
- NSUInteger i;
- unichar c =[c characterAtIndex:i]调用c的地i个字母,返回值是unichar。
- 小写转大写:[s1 uppercaseString]
- 大写转小写:[s1 lowercaseString]
- 仅首字母大写:[s1 capitalizedString]
- 字符串转换成基本类型:[s1 intValue],[s1 floatValue],[s1 boolValue]
- 字符串的截取(下标操作)(所有操作都是产生新的字符串,原来的字符串并没有改变)
- [s1 substringToIndex:12](从起始位置,到指定位置,不包含指定位置字符,不包含第12个)。
- [s1 substringFromIndex:12](从指定位置开始,截取到最后,包含指定位置的字符)。
- [s1 substringWithRange:NSMakeRange(2, 4)](从第二个,截取到第四个);
- 字符串的拼接
- [s1 stringByAppendingString:@“lizhen”]
- [s1 stringByAppendingFormat:@“%@%i”, s2, 4]
- 字符串的查找
- [s1 rangeOfString:@“wang”]如果找不到,返回NSNotFound。
- 字符串的替换[s1 stringByRepelacingOccurrencesOfString:@“wang” withString:@“Wang”]后边的把前边的替换掉(会替换掉所有的代替换字符串)。
- 可变字符串
- NSMutableString继承自NSString
- 区别:可变字符串可以在自身的基础上添加或者删除,不可变字符串添加或者删除会产生新的字符串,不能在自身上操作。
- 添加:[ms1 insertString:@“wa” atIndex:7]。
- 追加:[ms1 appendString:@“中古”]。
- 删除:
- NSRange r = [ms1 rangeOfString:@“中古”]
- [ms1 deleteCharactersInRange:r]。
- 替换
- [ms1 replaceCharactersInRange:r [email protected]“中国”]。
- 数组
- NSArray NSMutableArray
- oc数组只能存放oc对象,不能存储非oc对象,不能存放nil,可以存储不同类型的oc对象。
- NSArray * array = [NSArray array];(空数组)
- NSArray * array = [NSArray arrayWithObjict:@“kathy”];(一个元素)
- NSArray * array = [NSArray arrayWithObjict:@“kathy”, @“jim”, p,nil];(三个元素)
- 用%@可以打印数组的所有成员变量,调用了descripstion方法。其实在NSArray中重写了description方法,再去遍历数组的每一个元素,然后分别调用各自的description方法。
- 快速创建数组(此方法创建的是不可变数组):NSArray * array [email protected][@“hud”, @“iioer”, p1, p2];
- 查看数组元素个数
- [array count]只读,返回无符号长整型lu。
- 访问数组元素:[array objectAtIndex:3]查看第四个元素。
- 直接访问数组元素,编译器特性:array[3];
- 判断是否包含某对象,返回BOOL:[array containsObject:@“hello”];
- 查找某个对象在数组中的位置:[array indexOfObject:@“hello”],如过没有,返回NSNotFound。
- 字符串分割的结果保存在数组中:NSArray * array = [s componentsSeparatedByString:@“-“];遇到 - 就分割。
- 数组元素的遍历
- 1,for循环,array[i]
- 2,for(id obj in array){
- NSLog(@“%@“, obj);
- }
- 3,block遍历
- [array enumerateObjectUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
- NSLog(@“%lu,%@“,idx,obj );
- if(idx == 2){
- *stop = YES;
- }
- }];
- 可变数组NSMutableArray
- 根据一个不可变数组创建一个可变数组NSMutableArray *marray = [NSMutableArray arrayWithArray:array]。
- NSMutableArray *marray = [NSMutableArray arrayWithCapacity:5]创建有五个元素空间的可变数组。如果存满了,自动扩大容量。
- [marray addObject:@“jim”];增加一个对象
- marray.count实际存放元素的个数。
- 数组中允许存放相同的对象元素。
- 把一个不可变数组的所有元素的所有添加到可变数组中去:[marray addObjectsFromArray:array];
- 添加到中间:[marray insertObject:@“wa” atIndex:2]。
- 替换元素:[marray replaceObjectAtIndex:2 withObject:@“wangli”];
- 交换元素位置:[marray exchangeObjectAtIndex:0 withObjectAtIndex:1]
- 删除
- 根据下标删除:[marray removeObjectAtIndex:2]
- 删除指定对象(全部jim):[marray removeObject:@“jim”]
- 删除最后一个元素:[marray removeLastObject];
- 删除所有元素:[marray removeAllObjects];
- 将数组用,分开成字符串:NSString *str = [_imagesArray componentsJoinedByString:@","]。
- [str1 replaceOccurrensOfString: stringWithFormat:@“lu”, i withString:@”” option:NSLiteralSearch rang:NSMakeRange(0, str.length)]。
- [array writeToFile:@"/Users/apple/作业/oc/oc第八次作业王立震/b3/b3.txt" atomically:YES];
- arc4random()生成随机数。
- 子数组
- NSRang r = NSMakeRange(0,15);
- NSArray = [g1 subarrayWithRange:r]
- 集合
- NSSet NSMutableSet
- NSSet *s1 = [NSSet set] 空集合
- NSSet *s2 = [NSSet setWithObject:@“w1”,@“w2”,nil];
- NSSet *s2 = [NSSet setWithObjectArray:array] 通过数组创建集合
- set和array的区别
- 数组的元素是连续的,集合的元素是无序的,数组可以通过下标访问元素,集合不可以,数组元素可以重复,集合元素不能重复。
- 遍历set
- [s enumerateObjectsUsingBlock:^(id obj, BOOL *stop){
- NSLog(@“%@“,obj);
- }]
- [s anyObject] 随机取出一个元素。
- NSMutableSet 可变集合
- NSMutableSet *ms = [NSMutableSet set]
- [ms addObject:@“wer”] 添加
- [ms removeObject:@“hello”] 删除
- 字典NSDictionary
- key value:字典是用来存储键 值对组成的数据容器。键:一般是字符串age,值16岁,不允许出现相同的键值的元素,无序的。
- 创建一个字典
- NSDictionary *a1 = [NSDictionary dictionaryWithObject:@“wanglizhen” forKey:@“name”] 添加一个键值对的字典
- NSDictionary *a1 = [NSDictionary dictionaryWithObjects:array1 forKeys:array2] 添加多个键值队的字典
- NSDictionary *a1 = [NSDictionary dictionaryWithObjectsAndKeys:@“wanglizhen”,@“name”,@“hangzhou”,@“address”, nil] 多个键值队的字典。
- 用新语法创建的是不可变字典,不能把它直接赋值给可变字典:NSDictionary *a1 = @{@“name”: @“wanglizhen”, @“address”:@“hangzhou”}。
- 返回键值队的个数:a1.count。
- 访问元素:
- 根据键来找到对应的值:[a1 objectForKey:@“name”]
- 用键作为下标访问对应的值:a1[@“name”];
- 字典元素的遍历
- 先把key取出来,再根据key来获取值
- NSArray *array = [a1 allKeys]
- for(int i = 0; i < a1.count, i++){
- 得到键
- NSString *key = array[i];
- 根据键来取值
- NSLog(@“%@”,a1[key]);
- }
- 快速遍历:id 可换为NSString*
- for(id key in a1){
- NSLog(@“%@:%@“, key, a1[key]);
- }
- [a1 enumerateKeysObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
- NSLog(@“%@:%@”, key,obj);
- }];
- 可变字典:NSMutableDictionray *a2 = [NSMutableDictionary dictionaryWithCapacity:3];
- 添加键值对。不允许出现key相同的键值:[a2 setObject:@“wanglizhen” forKey:@“name”]
- 移除:[a2 removeObjectForKey:”name”]
- 删除多个键值对:[a2 removeObjectsForKeys:@[@“name”, @“address”]];
- NSNumber数字对象,只能转化基本对象,不能转化构造对象
- c转为oc
- NSNumber *num = [NSNumber numberWithInt:10];
- @12 @‘a’ @YES。
- int age = 100; @(age)不能去掉小括号。
- oc转为c:[nim intValue]。
- NSValue
- NSNumber继承了NSValue
- CGPoint p= CGPointMake(12,34);
- NSValue *v = [NSValue valueWithPoint:p]
- NSLog(@“%@“, v);打印类名和值
- NSDate:时间戳
- NSDate *date = [NSdate date];执行时间(格林威治的0时区时间)。
- 从现在往后一天:NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow:+24*60*60];
- 从现在往前一天:NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-24*60*60];
- 从yesterday往后一个小时:NSdate *date = [NSDate dateWithTimeInterval: *60*60 sinceDate:yesterday];
- 从1970到现在多长时间了:NSTimeInterval time = [date timeInervalSince1970];
- 当前时间到那个时间点:NSTimeInterval time = [date timeInervalSinceNow]; 为负值
- 日期比较
- NSComparisonResult res = [date comper:yesterday];
- NSOrderedAscending date > yesterday
- NSOrderedDescending date < yesterday;
- 日期格式化类(哪种格式输出)
- 2015-01-09 14:36:34
- NSDateFormatter *f = [[NSDateFormatter alloc] init]
- y年M月d日 m分s秒 H(24小时制) h(12)
- 以字符串格式输出
- f.dateFormat = @“yyyy-MM-dd HH:mm:ss”;
- NSString *str = [formatter stringFromDate:date];
- 设置时区
- NSTimeZone *z = [[NSSTimeZone alloc] initWithName:@“America/New_York”];
- f.timeZone = z;
- NSString *str = [formatter stringFromDate:date];
- 获得时区名称
- NSArray *zoneNames = [NSTimeZone knownTimeZoneNames];
- 字符串转换为时间对象(形式必须严格一致)
- NSString *time = @“2015/01/02/ 18:35”
- NSDateFormatter *f2 = [[NSDateFormatter alloc] init]
- f2.dateFormat = @“yyyy/MM/dd HH:mm”;
- NSDate *d = [f2 dateFromString:time]
- 异常情况处理
- @try @catch @finally @throw
- 数组越界
- 野指针
- 不能识别的方法选择器
- @try{
- 可能会出错的代码段;
- }
- @catch(NSException *exception){
- //try里错了,执行,否则不执行
- NSLog(@“错误是%@“, exception);
- }
- @finally{
- //不管错没错,都执行,可以选择写或者不写
- NSLog(@“oc结束了”);
- }