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;