iOS面试题一
来源:互联网 发布:国内域名国外空间 编辑:程序博客网 时间:2024/04/30 23:00
iOS面试题一
- 属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用, 在那种情况下用?
1> readwrite:同时生成get方法和set方法的声明和实现
2> readonly:只生成get方法的声明和实现
3> assign:set方法的实现是直接赋值,用于基本数据类型
4> retain:set方法的实现是release旧值,retain新值,用于OC对象类型
5> copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型
6> nonatomic:非原子性,set方法的实现不加锁(比atomic性能高)
现在的app大多数都是单线程的,为了提高效率多使用nonatomic修饰变量。atomic是一种线程保护,基本上来讲,就是防止在写入未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的。
atomic和nonatomic区别用来决定编译器生成的getter和setter是否为原子操作。atomic提供多线程安全,是描述该变量是否支持多线程的同步访问,如果选择了atomic 那么就是说,系统会自动的创建lock锁,锁定变量。nonatomic禁止多线程,变量保护,提高性能。
2.__weak和__strong的区别
(weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。
一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。
3.UIView的setNeedsDisplay和setNeedsLayout方法
首先两个方法都是异步执行的。而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到 UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,
就可以 处理子视图中的一些数据。
综上所诉,setNeedsDisplay方便绘图,而layoutSubViews方便出来数据。
layoutSubviews在以下情况下会被调用:
1、init初始化不会触发layoutSubviews。
2、addSubview会触发layoutSubviews。
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。
4、滚动一个UIScrollView会触发layoutSubviews。
5、旋转Screen会触发父UIView上的layoutSubviews事件。
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
7、直接调用setLayoutSubviews。
drawRect在以下情况下会被调用:
1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect调用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量值).
2、该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。
3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。
4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。
以上1,2推荐;而3,4不提倡
drawRect方法使用注意点:
1、若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或者 setNeedsDisplayInRect,让系统自动调该方法。
2、若使用calayer绘图,只能在drawInContext: 中(类似于drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法
3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕
4.写一个setter方法用于完成@property (nonatomic,retain)NSString *name,写一个setter方法用于完成@property(nonatomic,copy)NSString *name
- (void)setName:(NSString *) str { [str retain]; [name release]; name = str; } - (void)setName:(NSString *)str { id t = [str copy]; [name release]; name = t; }
6.内存优化问题
- 某页面成功dealloc,但是仍有内存残留
解决:instrument调试后,发现没被释放的全是imageIO,差不多就知道了,把读图的方式,从[UIImage imageNamed:@”“],改成imageWithContentsOfFile,就可以了。
问题原因:imageNamed读取图片的方法,会缓存在内存中,所以较大的图片,还是用imageWithContentsOfFile。
TIPs1:.xcassets里的图片无法用imageWithContentsOfFile读取;
TIPs2:imageWithContentsOfFile读取图片需要加文件后缀名如png,jpg等
- 图片读取总是出现迷之内存残留
解决步骤:
这个问题找了我很久,发现每次读缓存(memory)的时候都不会有内存增加,而从磁盘(disk)读取的时候,就会有问题。然后我就一步一步排查。最后在block里发现了这个:
问题原因:block里没有使用弱引用,导致一直持有self得不到释放。
TIPs:block引用self要慎重,如果self释放后仍有业务逻辑要在block中运行,可以再对weakSelf强引用一下。
- 使用GPUImage处理拍照的时候,内存稳定不明增长。
问题原因:
是Xcode7.1的问题。。只在debug的时候导致内存崩溃,release的时候并不会造成内存溢出,所以可以不必管它。
- iOS面试题(一)
- iOS 面试题(一)
- iOS面试题一
- iOS面试题(一)
- iOS面试题(一)
- iOS面试题 一
- iOS面试题<一>
- iOS面试题一
- iOS面试题一
- IOS面试题一
- iOS面试题(一)
- iOS面试题一
- iOS面试题(一)
- ios 面试题一
- IOS面试题详解(一)
- IOS面试题详解(一)
- ios 面试题(一)
- iOS面试题汇总(一)
- 指向对象的指针
- 不是经常用到的回调方法
- OS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、view
- 关于unity中BindChannels的理解
- 朴素贝叶斯法
- iOS面试题一
- 六步骤开发和发布自己的Android Studio类库
- angularjs1.0使用总结
- CRF as RNN的原理及Caffe实现
- 详解MySql优化步骤
- ActionListener的三种实现方法
- Oracle切换UNDO空间数据库后存储过程无法正常编译
- 处理一个关于binlog增量恢复很慢的问题
- valgrind 简介