IOS学习中的几个问题

来源:互联网 发布:mac上的打谱软件 编辑:程序博客网 时间:2024/06/05 15:38

1.描述IOS中MVC得具体体现。

答:MVC中的M是Model,即模型的意思。表示对数据的访问、处理和操作。V即View视图,用于显示界面。C是Controller控制器,用来控制和管理M和C,相当于它们之间交互的桥梁。IOS中充分运用了MVC模式,将数据的访问、业务逻辑与视图的显示分离开,用控制器来控制二者,来降低程序各模块间的耦合。例如,数据库的访问、持久化数据为Model,用UIView显示数据,但是不会直接使用,而是创建控制器UIViewController实例来执行显示的操作,控制View,使其显示。



2.copy和retain的区别?

答:copy一个对象,会开辟一个新内存区,然后复制对象到新内存区,还有个指向到新对象的新引用。

retain不会在堆中创建新对象,只会创建一个新的引用指向原有的对象。也就是说,retain会创建一个新的引用与原来的引用一起指向堆中的同一个对象。


3.描述一个完整的UIViewController生命周期?

答:UIViewController首先进行初始化,不能将加载视图的代码写到初始化里,而是在需要时再加载。需要加载视图时,会调用loadView方法,因此将代码写在这里面。执行完loadView方法后,会执行viewDidLoad方法。如图

当内存不足程序收到内存警告时,会释放不需要的视图。在IOS 6.0以前,要将释放代码写到unloadView方法里。在执行这个方法之前,会先执行viewWillUnload方法,接着执行unloadView方法,最后调用viewDidUnload方法。在IOS 6.0以后,直接将释放代码写到didRecieveMemoryWarning方法中即可。如图


4.readwrite、readonly、assign、retain、copy、nonatomic属性的作用。

答:readwrite表明既可读又可写。readonly表明只读。assign表明只会传值。retain表明会保留对象、创建一个引用指向该对象。copy表明会在堆中复制一个对象,有新引用指向该对象。nonatomic表明该对象不是原子性的,也就是多个线程可同时访问它,它不是线程安全的。


5.为什么很多内置类,如TableViewController的delegate的属性是assign不是retain?

答:防止产生循环引用。所有的引用计数系统,都存在循环应引用的问题。例如下面的引用关系:
    •    对象a创建并引用到了对象b.
    •    对象b创建并引用到了对象c.
    •    对象c创建并引用到了对象b.
这时候b和c的引用计数分别是2和1。当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放。b不释放,c的引用计数就是1,c也不会被释放。从此,b和c永远留在内存中。
这种情况,必须打断循环引用,通过其他规则来维护引用关系。比如,我们常见的delegate往往是assign方式的属性而不是retain方式 的属性,赋值不会增加引用计数,就是为了防止delegation两端产生不必要的循环引用。如果一个UITableViewController 对象a通过retain获取了UITableView对象b的所有权,这个UITableView对象b的delegate又是a, 如果这个delegate是retain方式的,那基本上就没有机会释放这两个对象了。自己在设计使用delegate模式时,也要注意这点。

0 0