一.OC的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承还是分类好?为什么?
不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重即成;
Category:是类别,用于向已经从在的类添加方法从而达到扩展已有类的目的,和子类不同的是,Category不能用于向北扩展类添加实例变量,通常作为一种组织框架代码的工具来使用.
Category的用途:
1.在不创建继承类的情况下实现对已由类的拓展。
2.简化类的开发工作
3.将常用的相关方法分组。
4.在没有源代码的情况下可以用来修复BUG
一般情况下用分类好,用Category去重写类的方法,仅对本Cayegory有效,不会影响到其他类与原有类的关系。
二.#import和#include由什么区别,@class呢,#import<>跟#import""又有什么区别?
1.#import是OC导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次不会重复导入,相当于#include和#pragma once;
2.@class告诉编译器某个类的声明,当执行时,才会去查看类的实现文件,可以解决头文件的互相饱含;
3.#improt<>用来包含系统的头文件,#imoport""用来包含用户头文件
三.属性readwrite,readonly,assign,retain,copy,nonatomic各什么作用?在哪种情况下使用
readwrite:可读可写,需要生成getter,setter方法时使用
readonly:只读,只会生成getter方法,不会生成setter方法,不希望属性在类外改变
assign:赋值,setter方法将传入参数赋值给实例变量,仅设置变量时使用
retain:表示持有特性,setter方法将传入参数西安保留,再赋值,传入参数的retaincount会+1;
copy:表示拷贝特性,setter方法将传入对象复制一份,需要完全一份心得变量时使用。
nonatomic非原子操作,决定编译器生成的setter,getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic.
四.写一个setter方法用于完成@property(nonatomic,retain)NSStringname,写一个setter方法用于完成@property(nonatomic,copy)NSStringname
-(void)setName:(NSString *)str
{
[name retain];
[name release];
name = str;
}
-(void)setName:(NSString*)str
{
id t = [str copy];
[name release];
name = t;
}
五.对于语句NSString *obj = [NSData alloc]init];obj在编译时和运行时分别是什么类型的对象。
编译时是字符串类型,运行时是NSData类型对象
六.常见的OC数据类型有哪些,和C的基本数据类型有什么区别。
NSString,NSArray,NSMutableArray,NSData等等,这些都是class,创建后便是对象,而C语言的基本数据类型是int,知识一定子节的内存空间,用于存放数值。
七.id声明的对象有什么特性
id声明的对象具有运行时的特性,可以指向任意类型的OC的对象
八.OC如何对内存管理的,说说你的看法和解决方法。
1.ARC(自动内存计数):通过alloc-initial方法创建的,创建后引用计数+1,此后每retain一次引用计数+1,那么在程序中做相应次数的release就可以了。
2.手动内存技术:一般由类的静态方法创建,函数名不会出现alloc或init滋养,创建后引用计数+0,在函数出栈后释放,相当于一个栈上的局部变量,也可以通过retain延长对象的生存期。
3.内存池:可以通过创建和释放内存池控制内存申请和回收的时机。由autorelease加入系统内存池,内存池时可以嵌套的,每个内存池都需要由一个创建释放对,将一个对象加入到最内层的系统内存池,当我们释放这个内存池时,其中的对象都会被释放。
八.使用nonatomic一定是线程安全的吗?
nonatomic的内存管理语义是非原子的,非原子的操作本来就是线程不安全的,而atomic的操作是原子的,但并不代表线程安全,能够增加正确机率,更好的避免线程错误,但是仍然是线程不安全的。
当使用nonatomic的时候,属性的setter和getter操作是非原子的,所以多个线程对某一属性进行读和写的操作,属性的最终结果是不能预测的。
atomic是线程安全的,nonatomic是线程不安全的。如果只是单线程操作的话用nonatomic最好,因为后者效率高。
九.如何高性能的给UIImageView加个圆角? (不准说layer.cornerRadius!)
一般情况下给 UIImageView 或者说 UIKit 的控件添加圆角都是改变clipsToBounds和layer.cornerRadius, 这样大约两行代码就可以解决. 但是, 这样使用这样的方法会强制 Core Animation 提前渲染屏幕的离屏绘制, 而离屏绘制就会为性能带来负面影响.
我们也可以使用另一种比较复杂的方式来为图片添加圆角, 这里就用到了贝塞尔曲线.
UIImageViewimageView= [[UIImageView alloc] initWithFrame:CGRectMake(0,0,100,100)]; imageView.center = CGPointMake(200,300); UIImageanotherImage= [UIImage imageNamed:@"image"]; UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0); [[UIBezierPath bezierPathWithRoundedRect:imageView.boundscornerRadius:50] addClip];[anotherImage drawInRect:imageView.bounds];imageView.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); [self.view addSubview:imageView];
十.http的POST和GET有什么区别
GET类型的请求是幂等的,而POST请求是有副作用的,GET用于获取一些资源而POST用于改变一些资源,这可能会创建新的资源或者更新已有的资源。POST请求比GET请求更加安全,也可以传输更多的信息。