黑马程序员技术交流社区

标题: 内存管理中的@property @class @autoreleasepool [打印本页]

作者: liminghui    时间: 2015-9-17 18:54
标题: 内存管理中的@property @class @autoreleasepool
@property参数:

                 书写规范:  @property (参数1,参数2) 数据类型  变量名

内存管理中@property的相关参数:
C:\Users\Administrator\Desktop
               

set方法处理中:

              retain : 对对象release旧值,再retain新值(使用于OC对象类型)

              assign : 直接赋值  (默认  使用于非OC对象类型)

              copy : release旧值 ,copy新值



    什么时候使用retain  :  

                  形式:  @property (nonatomic,retain)Car * car;

                   在一个类中有关联其他对象的时候。

    什么时候使用assign :

                  形式:  @property (nonatomic,assign)int  age;

                    实例变量是基本数据类型的时候。



@class 的使用:

                 书写规范: @class  类名;              例: @class  person;

含义:  告诉编译器,person 是一个类,至于类中有哪些属性和方法,此处不去检测,只是做一个声明。

好处:  如果person文件内容发生了改变,而包含@class  person的头文件的文件则不会重新编译。

                @class 可以解决循环引入的问题 (a里有b,b里有a);

个人理解:

            假如有文件 a,b,c,d类,a,b,c,d中都可以引用x类中的属性和方法,以前我们会在a,b,c,d的.h文件中标注“ import ''x.h'' ”头文件,但是如果x文件中的内容改变了,那么a,b,c,d中引用x的内容也会随之改变,不管你是否真的去引用,这样程序工作很不效率,所以我们只要在a,b,c,d的.h文件中把“ import ''x.h'' ”换成@class x;并且谁要调用x文件中的东西 就在谁的.m文件中写上 #import即可,这样效率大大的提高。

                .h  :    @class  x

                .m :      #import ''x.m''

自动释放池  autorelease:

                 autorelease 是栈结构,特点:先进后出

      autorelease的好处:  

                         1    不需要再关心对象释放的时间

                          2    不需要再关心什么时候调用 release

       autorelease的特点:

                          1   对象可以加入自动释放池中

                           2   自动释放池结束时,会给池中的对象发送一条release消息

       autorelease的使用:

                            1  创建自动释放池:

                                     @autoreleasepool {

                                                                       }

                             2  加入自动释放池中:

                                        [对象   autorelease];

      autorelease的使用注意:

                     1   并不是所有放到自动释放池中的代码产生的对象就会自动释放,如需要释放,必须加入到自动释放池中。             [对象   autorelease];

                     2   如果对象调用了autorelease,但是没有在任意一个自动释放池中,该对象也不会被加入到自动释放池。

                     3   另一种形式:

                                   Person *p = [Person new];

                                      @autoreleasepool {

                                                 [P autorelease];   

                                                                }

                      4 自动释放池的镶嵌:

                                1 @autoreleasepool {

                                             2  @autoreleasepool {

                                                           3 @autoreleasepool {

                                                                                                       }

                                                                                           }

                                                                               }              

                                   先释放 3 @autoreleasepool然后是2 @autoreleasepool最后是1 @autoreleasepool

                                     这就是先进后出。

                         5   自动释放池中不宜放占用内存较大的对象,  不要把大量循环操作放到同一个@autorelease中




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2