自己总结的面试题


1、生成Image时

+ (UIImage *)imageWithContentsOfFile:(NSString *)path

+ (UIImage *)imageNamed:(NSString *)name

二者在什么情况下使用,为什么?

答:使用大的图片,如果不是常用,那么用 imagewithcontentsoffile 方法,比较小的(比如图标),需要经常使用的,那么用后者,imageNamed 加载。内存常驻,效率高。不过,如果图片比较多,一起用 imagenamed 加载,很容易内存泄露,程序崩溃,还需要及时关闭动画,清除图片数组等措施。


2、优化UITableViewCell

正确使用reuseIdentifier来重用Cells

尽量使所有的view opaque,包括Cell自身,同时尽量少用或不用透明图层

如果Cell内现实的内容来自web,使用异步加载,缓存请求结果。

减少subviews的数量,把cell画出来,

尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制是否显示

在heightForRowAtIndexPath:中尽量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果


3、NSString属性copy和strong有什么区别吗?

NSMutableString*mStr = [NSMutableString stringWithFormat:@"abc"];

self.rStr= mStr;

self.cStr= mStr;

copy是深复制,cStr内存地址与指针均与赋值字串的不一样,不会随着mStr赋值字串的值变化;

strong,retain是浅复制,指针虽然不同,但都指向同一个内存地址,会随着mStr的变化而变化;

上面的情况是针对于当把NSMutableString赋值给NSString的时候,才会有不同,如果是赋值是NSString对象,那么使用copy还是strong,结果都是一样的,因为NSString对象根本就不能改变自身的值,他是不可变的。

拓展引申:在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!


4、nil、Nil、NULL和NSNull的理解

nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空。

nil:我们给对象赋值时一般会使用object = nil,表示我想把这个对象内存释放掉,此时是个空指针

Nil:nil和Nil在使用上是没有严格限定的,也就是说凡是使用nil的地方都可以用Nil来代替,反之亦然。只不过从编程人员的规约中我们约定俗成地将nil表示一个空对象,Nil表示一个空类

NSNull:[NSNull null]值为空的对象

NULL:C语言的语法,它表示一个空指针,int *ponit = NULL;

你可能感兴趣的:(自己总结的面试题)