for(inti=0;i<largenumber;i++){ Person * p = [Person person];代码的问题

来源:互联网 发布:南风知我意 txt下载 编辑:程序博客网 时间:2024/04/19 16:53

int largenumber = 1000000000;

                      for(inti=0;i<largenumber;i++){

                                        Person * p = [Person person];

                                      [p study];

                      }

                  这段代码有什么问题,应该怎么去改?为什么?(不要修改以写出的代码)

 

                      因为便利构造器产生的对象如果没有autoreleasepool的话是无法释放的,所以当循环数值过大时,产生的对象会越来越多而且使用过的对象无法释放,内存占用越来越大,严重影响性能.所以要在for循环中使用autoreleasepool,

 

                      intlargenumber = 1000000000;

                      for(int i=0;i<largenumber;i++){

                                             @autoreleasepool{

                                                          Person * p = [Person person];

                                                       [p study];

                                             }

                      }


简述内存管理的原则. 按照默认法则.哪些关键字生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?

 

:      1.对你自己拥有的对象负责,你只能释放你拥有的对象。

                   2.凡是你通过retainalloccopy等获得了所有权的对象,都必须在你不再使用它的时候,由你来releaseautorelease等手段来释放对它的所有权。

                     3.在一定的代码段内,对同一个对象所做的retainalloccopy的操作次数应该与releaseautorelease操作的次数相等。

                     4.可以在类的dealloc方法中释放你所占有的实例变量。

                     5.对于便利构造器和访问器来说,你没有通过retainalloccopy获得对象的所有权,因此在这些情况下你无须对获得对象进行额外的释放操作。

                      6.autorelease只不过意味着预定延迟发送一条release,当前引用计数并没有变。

                     

                     通过alloc copy retain生成的对象需要手动释放。

                      实现类的dealloc方法,在dealloc方法中,对持有的对象进行release操作。

                      过意味着预定延迟发送一条release,当前引用计数并没有变。


@class和#import的区别? @class和#import的使用场景是什么?

 

                      @class是标记一个字符串可以作为类名使用,#import是将一个文件的内容复制到当前文件中。

           在类的接口部分中需要声明其他自定义类型变量时,可以在类的头文件中使用@class标记某个字符串作为类名使用。在类的实现部分需要使用其他自定义类型对象时,需要在类的实现文件中使用#import导入头文件。

 

协议是什么?协议的property声明用什么属性?为什么?

                      协议是多个类共享的一个方法列表,在协议中所列出的方法没有响应的实现,由其它人来实现

                      协议的property声明用assign特性,因为要防止对象和其代理对象之间相互引用,导致无法释放内存.

 

扩展一个类的功能有几种途径?有什么区别?

 

                      1.类目

                类目可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除原有方法。但是无法添添加实例变量

                       2.延展

                                            延展可以同时添加实例变量和方法,而且添加的方法必须实现,可以视为一个私有的类目

                       3.协议

                                             协议是多个类共享的一个方法列表,在协议中所列出的方法没有响应的实现.

                       4.继承

                                             不但可以添加实例变量和方法,也可以重写原有类的方法.

 

                     

                     


0 0
原创粉丝点击