遇到的小知识点(不断更新)

Delegate:接收者和发送者是直接的一对一的关系,目的是改变或者传递控制链,允许一个类在某些特定时刻通知到其他类,从而不需要获取到那些类的指针.消息发送者告知接收者某个事件将要发生,delegate同意然后发送者响应事件.delegate机制使得接收者可以改变发送者的行为.

KVC:一个对象在调用setValue的时候,检查是否存在相应keyset方法,存在就调用set方法;set方法不存在,就查找_key的成员变量是否存在,存在就赋值;_key没找到,就查找相同名称的key,存在就赋值;如果没有就调用valueForUndefinedKeysetValue:forUndefinedKey

KVO:观察者模式,键值观察机制,一对多,提供观察某个对象某一个属性变化的方法,当这个属性的setter方法调用时,就会触发响应

Notification:观察者模式,发送者和接收者的关系是间接的多对多关系,消息的发送者告知接收者事件已经发生或者将要发生,接收者不会反过来影响发送者行为

Block:实际是匿名函数,
-
(void)funcWithBlock:(void(^)(NSString *s))block{}
block传值的时候,在第二个界面定义一个block,设置一个block属性的变量,然后在一个方法中使用这个block,并传入参数,回到第一个界面,在第一个界面生成第二个界面的地方,调用这个block,获取到这个block的参数.

区别:效率肯定是delegatenotification高,当两个模块联系不是很紧密的时候用notification传值,例如多线程,delegate是一种简单的回调

懒加载:当用到的时候才去初始化,延时加载.tableView中图片的加载显示,一个延时加载避免内存过高,一个异步加载避免线程堵塞.

多继承:OC中没有多继承,一个子类只能有一个父类,如果要实现多继承,可以通过类别Category和协议Protoal的方式来实现.
代理协议模式,可以实现多个接口;Category一般使用分类,用Category去重写类的方法,仅对本Category有效,不会影响到其他类和原有类的关系

类别延展:类别在没有原类.m文件的基础上,给该类添加方法
延展:一种特殊形式的类别,主要在一个类的.m文件里声明和实现延展的作用,给某个类添加私有方法和私有变量
区别:延展添加属性,并添加方法必须实现,私有的类目;类别可以再不知道不改变原来代码的情况下往里面添加新的方法,只能添加不能修改删除,可以覆盖原来的方法,继承可以增加修改删除方法,添加属性
Category
只能给对象添加方法,不能添加成员变量,如果添加成员变量,添加的成员变量没有办法初始化
Swift
extention:1.添加计算实例属性(computed property)和计算类属性2.定义实例方法和类方法3.提供新的构造器
4.
定义和使用新的嵌套类型5.定义下标(subscipt6.使其遵守某个接口协议

OC:
只有静态方法和实例方法,可以把方法声明和定义放在.m中,实现一个表面的私有方法;私有变量可以通过@private或者放在.m中;OC中所以实例变量默认都是私有的,所有实例方法默认都是公有的

Swift
final可以保证不被子类改变

#import
include基础上改进,保证头文件只会被引用一次,这样就不会交叉引入包含
import
@class二者区别:import会连接入所有该头文件的全部信息,包括实例变量和方法;@class只是告诉编译器,其后面的声明的名称是类的名称.一般头文件中用@class.实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以用#import;当两个类需要相互引用的时候,用@class

深拷贝浅拷贝:
浅拷贝只拷贝指向对象的指针,而不复制引用对象本身;深拷贝复制引用对象本身

@protected:
该类和子类中访问 @private只能本类中访问 @public 任何地方都能访问 @package本包内使用跨包不可以

OC
C++都是C的面向对象的超集;OC是完全动态的支持运行时动态类型确定,动态绑定,动态装载;C++是部分动态,编译时静态绑定,通过嵌入类和虚函数来模拟实现;OC语言层次上支持动态消息转发

target-action:
目标是动作消息的接收者,动作是控件发送给目标的消息,或者从目标的角度看,他的目标是味蕾响应动作而实现的方法.程序需要某些机制来进行事件和指令的翻译,这个机制就是

OC
的优点:1 categories 2 Posing 3动态识别 4指标计算 5弹性讯息传递 6可以C++混编
缺点:1 不支持命名空间 2不支持运算符重载 3不支持多重继承 4使用动态运行时类型所有方法都是函数调用,性能不好
Swift
中有命名空间

OC
函数调用,在编译的时候就会决定调用哪个函数,编译完成之后直接顺序执行,
OC
函数调用成为消息发送,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有当真正运行的时候才会根据函数的明朝找到对应的函数来调用

OC
的动态特性表现为了三个方面:动态类型、动态绑定、动态加载。之所以叫做动态,是因为必须到运行时(run time)才会做一些事情。
(1)动态类型,id类型,静态类型在编译的时候就能被识别出来,动态类型就编译器编译的时候不能被识别,runtime的时候根据语境来识别
(2)动态绑定:动态绑定要实现他就必须用SEL变量绑定一个方法,OC跳过编译,运行的时候动态添加函数调用,运行时决定调用什么方法,传什么参数;
消息发送机制:调用一个实例的方法,所做的是向该实例的指针发送消息,实例在收到消息后,从自身的实现中寻找响应这条消息的方法.
3)动态加载
根据需求加载所需要的资源;最经典的例子就是在Retina设备上加载@2x的图片,而在老一些的普通屏设备上加载原图。

谓词:
通过NSPredicate给定的逻辑条件作为约束条件,完成对数据的筛选.配合正则表达式语法

C OC
混用
.m
可以识别COC .mm可以识别C C++ OC cpp只能用C C++

atomic
nonatomic的区别
atomic
提供多线程的安全,防止读写未完成的时候被另一个线程读写,造成读写错误
nonatomic
在自己管理内存的环境中,解析的访问器保留并自动释放返回值,若指定了nonatomic,那么访问器只是简单的返回这个值
两个属性生成的set get方法不同, @synchronized(self) {}是否会加一个线程锁,保证线程安全,在一个线程正在执行setter/getter方法的时候,其他线程就得等待

常见的OC数据类型: NSInteger CGFloat NSString NSNumber NSArray NSDate
NSInteger
根据32/64位系统决定本身是int 还是long
CGFloat
根据32/64位系统决定本身是float/double
NSString NSNumber NSArray NSDate
是指针类型的对象 ,在堆中分配内存,c语言中的char int等都是在栈中分配空间

id
nil
id
类型的指针可以指向任何OC对象,nil代表空值,空指针的值,0
nil
表示对象的指针,即对象的引用为空,NULL表示指向基础数据类型变量,即C语言变量的指针为空
ARC中两个可以互换,但是ARC中普通指针和对象引用被严格限制,不能互换
nil
C语言的NULL相同,nilOC对象指针为空,NULLC语言指针空值,OCnil对象调用任何方法表示什么都不执行也不会崩溃
Nil:OC
中代表((void *)0),用于代表空类型, Class myClass = Nil;
NSNull:NSNull
是继承于NSObject的类型,表示空,但是一个对象,占位对象 . 比如服务器接口中让我们的值为空时,传空.NSDictionry *parameters = @{@"arg1" : @"value1",@"arg2" : arg2.isEmpty ? [NSNull null] : arg2};
NULL
是宏,针对C语言指针而使用,表示空指针
nil
是宏,OC对象使用,表示对象为空
Nil
是宏,OC类使用,表示类指向为空
NSNull
是类类型,用于表示空的占位对象,与JS或者服务端的null有类似的含义

nil对象发送消息会发生什么
nil发送消息是完全有效的,只是在运行时不会有任何作用
如果一个方法返回值是一个对象,那么发送给nil的消息,将返回0(nil)
如果方法返回值为指针类型,其指针大小为小于或者等于sizeof(void*),float...整型变量,发送给nil的消息将返回0

类方法和实例方法:
类方法属于类对象,只能列对象调用,self是类对象,类方法可以调用其他类方法,类方法不能访问成员变量,类方法不能直接调用对象方法,实例方法属于实例对象,实例对象调用,self是实例对象,实例方法可以调用实例方法,实例方法可以访问成员变量,实例方法可以调用类方法

__block/weak
修饰符区别
__block
ARC mrc环境下都能使用,可以修饰对象,也能修饰基本数据类型,
__weak
只能在ARC环境下使用,只能修饰对象,不能修饰基本数据类型
__block
对象可以再block中重新赋值,__weak不行

init initWithObject
区别
后者给属性赋值

@property
的本质是什么:ivar getter setter,编译器自动合成,通过@synthesize关键字指定属性的成员变量.

@property
(copy)NSMutableArray *array;
没有指明为nonatomic,原子操作,影响性能,该属性使用了同步锁,会在创建时生成一些额外的代码用于帮助编写多线程程序.atomic并不能保证绝对的线程安全,对于要绝对保证线程安全的操作,还可以用NSSpinLock @syncronized
使用copy,所有得到的实际是NSArray类型,不可变

属性关键字:原子性:atomic nonatomic 读写:readwrite readonly 内存管理:assign strong weak unsafe_unretained copy
getter setter

@protocol
中使用@property只会生成settergetter方法声明,我们使用属性的目的是希望遵守我协议的对象能实现该属性
category
使用@property也只会生成settergetter方法的声明,如果我们真的需要给Category增加属性的实现,需要借助于运行时的两个函数,objc_setAssociatedObject objc_getAssociatedObject

如何访问并修改一个类的私有属性:kvc获取  runtime访问并修改私有属性

class定义一个对外只读对内可读写的属性
头文件中将属性定义为readonly,在.m文件中将属性重新定义为readwrite

OC
class是如何实现的,Selector是如何被转化为C语言的函数调用的
当一个类被正确编译过后,在这个编译成功的类里面,攒在一个变量用于保存这个类的信息,我们可以通过[NSSClassFromString]或[obj class]这样的机制允许我们在程序执行的过程中可以Class来得到对象的类,也可以再程序执行的阶段动态的生成一个在编译阶段无法确定的一个对象
C
语言中可以把函数名直接赋给一个函数指针,OC不可以,用@selector语法获取

NSString *obj =
[[NSData alloc] init] ,编译时是NSString 运行时是NSData类型

@synthesize @dynamic
@dynamic:
告诉编译器settergetter方法由用户自己实现,不自动

NSString: copy strong
的区别 .NSString为不可变字符串的时候,copystrong都只分配一次内存,如果是copy的时候,首先判断字符串是否是不可变字符串,如果是不可变字符串就不再分配空间,如果是可变字符串才分配空间.如果程序中NSString的地方特别多,每一次都要先进性判断就会耗费性能,影响用户体验,用strong就不会再进行判断,所以不可变字符串可以直接用strong.
采用copy的原因是,防止将可变字符串赋值给NSString对象之后,可变字符串修改后,对象会随着改变.因为strong不会判断赋值对象是否可变,不再分配空间.











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值