zoukankan      html  css  js  c++  java
  • @property

    @property

     
    Objective-C语言关键词,与@synthesize配对使用。
    xcode4.5以及以后的版本,@synthesize可以省略
    功能:系统自动生成setter和getter方法.简单的说就是直接生成了bean.比eclipse的功能还能强大!!!
     
    如:
    1、在头文件中:
    @property int count;
    等效于在头文件中声明2个方法:
    - (int)count;
    -(void)setCount:(int)newCount;
    2、实现文件(.m)中
    @synthesize count;
    等效于在实现文件(.m)中实现2个方法。
    - (int)count
    {
       return count;
    }
    -(void)setCount:(int)newCount
    {
       count = newCount;
    }
    以上等效的函数部分由编译器自动帮开发者填充完成,简化了编码输入工作量。
    声明property的语法为:
    @property (参数1,参数2) 类型 名字;
    如:
    @property(nonatomic,retain) UIWindow *window;
    其中参数主要分为三类:
    读写属性: (readwrite/readonly)
    setter语意:(assign/retain/copy)
    原子性: (atomicity/nonatomic)
    各参数意义如下:
    readwrite
    产生setter\getter方法
    readonly
    只产生简单的getter,没有setter。
    assign
    默认类型,setter方法直接赋值,而不进行retain操作
    retain
    setter方法对参数进行release旧值,再retain新值。
    copy
    setter方法进行Copy操作,与retain一样
    nonatomic
    禁止多线程,变量保护,提高性能
    参数中比较复杂的是retain和copy,具体分析如下:
     
    getter分析
    1、 @property(nonatomic,retain)test* thetest;
    @property(nonatomic ,copy)test* thetest;
    等效代码:
    -(test*)thetest
    {
       return thetest;
    }
    2、@property(retain)test* thetest;
    @property(copy)test* thetest;
    等效代码:
    -(void)thetest
    {
       [thetest retain];
       return [thetest autorelease];
    }

    setter分析

    1、
    @property(nonatomic,retain)test* thetest;
    @property(retain)test* thetest;
    等效于:
    -(void)setThetest:(test *)newThetest {
      if (thetest!= newThetest) {
        [thetestrelease];
        thetest= [newThetest retain];
      }
    }
    2@property(nonatomic,copy)test* thetest;
    @property(copy)test* thetest;
    等效于:
    -(void)setThetest:(test *)newThetest {
      if (thetest!= newThetest) {
        [thetestrelease];
        thetest= [newThetest copy];
      }
    }
     
     

    retain和copy还有assign的区别  

     
    1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候会引起程序crash掉。 


    2. 了解到1中assign的问题,那么如何解决?最简单的一个方法就是使用引用计数(reference counting),还是上面的那个例子,我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用计数是1。当把a赋值给b时引用计数增加到2。这时如果a不再使用这块内存,它只需要把引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数减1。当引用计数变为0的时候,代表该内存不再被任何指针所引用,系统可以把它直接释放掉。 


    3. 上面两点其实就是assign和retain的区别,assign就是直接赋值,从而可能引起1中的问题,当数据为int, float等原生类型时,可以使用assign。retain就如2中所述,使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。 
    4. copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。 
    5. atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样: 

    1. if (property != newValue) {   
    2.     [property release];   
    3.     property = [newValue retain];   
    4. }  
     
  • 相关阅读:
    Hive安装
    hbase安装
    Spring boot 出现的时间
    RESTful Web API 实践
    Java的进阶之道
    Spring boot 注解简单备忘
    使用 xshell 登录 Windows 的 linux 子系统
    Nginx 实用配置
    跟着大彬读源码
    跟着大彬读源码
  • 原文地址:https://www.cnblogs.com/mohe/p/2993600.html
Copyright © 2011-2022 走看看