一
浅复制和深复制的区别?
浅层复制就是复制一个指针指向引用的对象,但是深层复制是指把整个引用对象都复制了。
NSString *st1=@"123";
NSString *tainStr1=[st1 retain];// 浅复制
NSMutableString *copyStr1=[st1 copy];//浅复制
// [copyStr1 appendString:@"11"]; 浅复制的内容是不可以改变的否则会崩溃
NSString *mutableCopyStr1=[st1 mutableCopy];//深复制
NSLog(@"%p %p %p %p",st1,tainStr1,copyStr1,mutableCopyStr1);
打印结果为:
0x10634b240 0x10634b240 0x10634b240 0x7f8d89468160
可以看到只有第四个地址与前三个不同。
现在Xcode都是自动内存管理模式了,我们可以通过在TARGETS-->Build Phases中修改compiler Flags给它添加上:-fno-objc-arc ,项目支持MRC,同样,如果你想自己手动管理内存,也可让项目支持ARC,只需把添加上:-fobic-arc 或者直接删除-fno-objc-arc。
二 类别 扩展 继承
选择objective-C File,里面FileType可以选择Empty File,Category,Protocol和Extension .
类别为现有的类扩展方法,理论上是不可以定义新的变量,但是可以使用@dynamic 来弥补这种不足
@interface UIView (tapCategory)
-(void)printfHello;
@end
@implementation UIView (tapCategory)
-(void)printfHello
{
NSLog(@"hello");
}
@end
UIImageView *view=[[UIImageView alloc]initWithFrame:CGRectMake(0, 100, 50, 20)];
view.backgroundColor=[UIColor redColor];
[self.view addSubview:view];
[view printfHello];
//一般的时候,Extension都是放在.m文件中@implementation的上方。
@interface MyClass ()
@property (retain, readwrite) float value;
@end
使用Extension需要注意的点:
(1) Extension中的方法必须在@implementation中实现,否则编译会报错。
至于代理主要功能是传递消息,在不获取一个类的指针的情况下想它传递消息,减少框架的复杂度。代理也是可以为一个类添加方法的。协议里面的方法分为两种
@protocol happyDelegate <NSObject>
@required
//这里的方法必须实现
@optional
//这里的方法选择实现
@end
Key-value coding,它是一种使用字符串标识符,间接访问对象属性的机制,而不是直接调用getter 和 setter方法。通常我们使用valueForKey 来替代getter 方法,setValue:forKey来代替setter方法.
@property(nonatomic, copy)NSString *name;
[self setValue:@"huahua" forKey:@"name"];
NSLog(@"%@",[self valueForKeyPath:@"name"]);
Key-Value Observing (KVO) 建立在 KVC 之上,它能够观察一个对象的 KVC key path 值的变化.个人觉得这也是一种消息通知的方法和代理 通知 block一样的功能。
四 delegate和NSNOTIFICATION的区别
协议有控制链 但是代理没有。简单来说就是通知是一对多,代理是一对一。一个通知发出可以有很多对象收到然后执行相应的处理。
但是代理一般都是一对一的。
五 oc是动态运行时语言
多态是不同的对象以自己的方式响应一种方法,一个函数的方法可以有多个对象调用。
运行时指 OC 对象直到运行时才决定这个对象的类别以及调用的该类别指定的方法。
六 消息推送
推送分为本地推送和远程推送,本地推送是触发时间达到的目的比如闹钟。远程推送是由苹果APNS(苹果的推送服务器 Apple Push Notification Service)移送的。
远程推送流程如下:
1 iPhone 应用程序自身注册有获取推送的能力,然后OS系统向APNS 发送消息获得一个设备的token。
2 APNS将获取的token发送给app 然后app,将获取的这个token发送给后台。
3推送都是由后台发送给APNS的 然后由APNS推送给Iphone的。
七 多态性
父类指针指向子类对象
//NSMutableArray的父类是 NSArray
NSArray *array=@[@"11",@"22"];
NSMutableArray *mutableArray=[[NSMutableArray alloc]initWithArray:array];
// mutableArray=array; 这个就是不对的
array=mutableArray;//这个是对的
延时加载避免内存过高,用到的时候再加载。
九 #import"" #import<> #include @class 的区别
#import"" 是导入自己的文件 #import<> 是导入系统的文件
#import 都是只导入头文件一次
#include 一般是在C C++ 代码中用到
@class 是告诉某个编译器某个类的声明 ,到用到时在查看这个文件的实现文件,可以解决文件的相互包含。
十 OC 可以多重继承吗
OC 不可以多重继承,但是可以通过代理,实现多个接口等方式来变相的实现多重继承。