目录
类 对象
继承 多态 方法
NSSTring NSValue NSNumber
集合
内存管理
属性
设计模式 引用传值
类目 延展 协议
begain
1
一个对象永远不会保存另外一个对象(保存指针)
面向对象编程语言的特点:封装,继承,多态
NextSTEP = cocoa
@class Hero 1.预先申明,避免交叉引用 2.代替#import ,不需要 导入头文件重新编译
@class #import #include的区别 ?????????
OC 数据:typedef类型(NSInteger(= int long),CGFloat(= float,double),NSPoint( = struct _NSPoint)) 和对象类型(NSString(!= char *),NSNumber)
nextStep, cocoa的由来:oc开始火爆的原因和时间:
面向对象:封装(隐藏内部实现,稳定外部接口,封装就是定义类,定义属性,定义方法),继承(子类可以复用父类所有方法的申明和实现,非私有的实例变量以及协议,继承具有单根性和传递性,继承就是代码优化公共部分交给父lei),多态(不同对象对同一消息的不同响应,子类可以重写父lei的方法,多态就是允许方法重名,参数或返回值可以使父类型传入或者返回,description,init)
OC 具有静态语言的特性,又有动态语言的效率
动态类型(id类型):在编译时不能识别,只有运行时才可
动态绑定(@select / SEL):oc中无函数概念只有消息机制,跳过编译,运行时才动态的添加函数调用,在运行时才决定调用什么方法,需要传模式参数进去,要实现他就定义一个SEL整数(方法的ID)遍历绑定一个方法来引用(函数调用是根据函数名字符串来查找,速度比根据整数查找慢)
动态加载:动态的加载资源,
@的作用:关键字起始符
init初始化
dealloc 属性减一 |release 对象计数减一
传值方式:单例,NSUserdefault,属性,KVO,KVC,通知(NSNoticationCenter)
类簇(class cluster,抽象工厂类,提供抽象接口,具体实现由内部类实现)类:NSString,NSNumber,NSDictinary,NSArray
----------------------------
类目:系统的类不可以添加属性,其他可以,但是要自己写setter getter方法,一般都可添加方法
延展:不可见
协议:
-----------------------------
私有成员变量:其他类访问不到
属性:整个工程都可见
------------------------------
clang llvm( Low Level Virtual Machine )龙书
Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。
设计模式:KVO KVC 单例 代理模式
2.OC 与 C 与 C++的不同点:
OC:面向对象,动态的封闭语言,单继承(有protocols和categories),smalltalk学派(更灵活,允许出错),c的超集(可兼容C的全部语法)
C++: 面向对象,静态的封闭语言,多继承,simula 67学派(更安全,不灵活),兼容C的大部分语法
C :面向过程,开源语言
3.import :防止重复引用头文件
4.int main(int argc, const char * argv[] char **env) : 首先是一个计算提供的参数到程序, 第二个是对字符串数组的指针。
argc: 整数,用来统计你运行程序时送给main函数的命令行参数的个数
argv[ ]: 字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数
argv[0] 指向程序运行的全路径名或者程序名字 argv[1] 指向在DOS命令行中执行程序名后的第一个字符串 argv[2] 指向执行程序名后的第二个字符串 ... argv[argc]为NULL
**env:字符串数组。env[ ]的每一个元素都包含ENVVAR=value形式的字符 串。其中ENVVAR为环境变量,value 为ENVVAR的对应值。 argc, argv,env是在main( )函数之前被赋值的,编译器生成的可执行文件,main( )不是真正的入口点,而是一个标准的函数,这个函数名与具体的操作系统有关。
5.@ 关键字起始符号
6.框架是一组类的集合,而这些类互相关联,cocoa Touch是一组框架的集合
7.面向对象的回调机制:
委托:单个委托对象可以接收针对某个特定对象的全部事件消息,对象只 能向其委托对象发送一组特定协议所申明的消息
凡是支持委托的对象,其背后都有一个相应的协议,申明可以向该委托对象发送的消息,为其感兴趣的事件实现相应的方法;
如果某个类实现了某个协议中的方法,则该类遵守该协议
目标动作对:当某个特定事件发生时,发生的事件的一方会向指定的目标对象发送一个之前设定好的动作消息,针对不同事件(请按),需要创建不同的目标动作对。
8.协议不是类,是一组特定的方法,不能为协议创建实例,或添加实例变量,协议自身不实现方法,需要由遵循相应协议的类实现
用于委托的协议成为委托协议,不是所有协议都是委托协议
delegate 特性:_unsafeunretained(防止retain循环)
9.构建阶段:编译源代码(预处理,编译),连接二进制文件和库,拷贝程序资源
预处理:处理#语句(import / define),预处理为中间文件.ml文件
编译:将中间文件转换为机器码,不过也保存在中间文件中---编译时错误,为语法错误
连接:设置链接,指向被链接的文件(框架是类的集合,其实现文件已编译,是目标文件,为库)---连接器错误,无法处理链接,找不到文件或者
10.getter setter 用于保护变量不被外界访问(默认为peotected属性,不能被外界访问,设置为public则容易被攻击,因为大家都可以访问)的时候,公开这两个方法(方法默认为public)即可以通过这个方法访问成员变量
11.protected private public ????????????? 作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
12.oc中调用方法时,不看指针看对象,称为虚方法
13.
(1).3种类型集合:数组NSarray 字典 NSDictionary(无序) 集NSSet(无序,哈希算法,内存不连续,只能一次取一个或者全部取出,不可重复,如有重复自动清除)
(2).集合中都只能是对象,这个对象是数组
(3).集合中不能存放Nil对象,nil是集合结束符标识
(4). ios5 (不可变): 字符串:@"",id:@() ,NSArray :@[], NADictionary: @{} char[] @encode()
14.内存:程序运行时临时分配的存储空间,在程序结束后释放
(1).继承自NSObject的对象才需要进行内存管理
(2).对象的生命周期:初始化,使用,释放
(3).@property:
Retain:对对象release旧值,retain新值(适用于OC对象类型)
Assign:直接赋值(默认,适用于非oc对象类型]
Copy:release旧值,copy新值
(4)Autorelease注意:
1)系统自带的方法中,如果不包含alloc new copy等,则这些方法返回的对象都是autorelease的,如[NSDate date];
2)开发中经常会写一些类方法来快速创建一个autorelease对象,创建对象时不要直接使用类名,而是使用self
(5).ARC准则:无强指针,则释放,
(6).通过便利构造创建的对象不需要进行release操作
15.KVC运用了一个isa-swizzling技术。
isa-swizzling就是类型混合指针机制。KVC主要通过isa-swizzling,来实现其内部查找定位的。
isa指针,就是is a kind of的意思,指向维护分发表的对象的类。该分发表实际上包含了指向实现类中的方法的指针,和其它数据。 KVC在调用方法setValue的时候
(1)首先根据方法名找到运行方法的时候所需要的环境参数。
(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。
(3)再直接查找得来的具体的方法实现。
这样的话前面介绍的KVO实现就好理解了
当一个对象注册了一个观察者,被观察对象的isa指针被修改的时候,isa指针就会指向一个中间类,而不是真实的类。
所以isa指针其实不需要指向实例对象真实的类。所以我们的程序最好不要依赖于isa指针。在调用类的方法的时候,最好要明确对象实例的类名。
这样只有当我们调用KVC去访问key值的时候KVO才会起作用。所以肯定确定的是,KVO是基于KVC实现的。
正则表达式
1.验证用户名和密码:"^[a-zA-Z]\w{5,15}$"
2.验证电话号码:"^(\d{3,4}-)\d{7,8}$"
3.验证手机号码: "^1[3|4|5|7|8][0,9]\d{8}$"
4.验证Email地址:(“^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)$”)
5.只能输入整数或者小数:^[0-9]+([.]{0,1}[0-9]+){0,1}$
6.只能输入汉字:”^[\u4e00-\u9fa5]{0,}$”。
7.匹配双字节字符(包括汉字在内):[^\x00-\xff](计算字符串长度,一个双字节字符长度记2 ASCii字符记1)
8.匹配空白行的正则表达式:\n\s\r(删除空白行)
9.匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$(表单验证时很实用)
10.\num 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
x .== 判断内存地址 基本变量 对于一些基本类型 可以使用==来判断,但对于指针类型,使用==则判断的是指针保存的内容地址是否相等,而不是判断内存地址下的内容是否相等(应该通过方法来判断)
y. 静态方法返回的对象一般都不需要手动释放内存