• interface property笔记


    oc;有2种定义变量的方式
    1.在  @interface :NSObject{} 的括号中,当然NSObject 是指一个父类,可以是其他的。
    形式如下:1

    2
    3
    4
    @interface GCTurnBasedMatchHelper : NSObject {
      BOOL gameCenterAvailable;
      BOOL userAuthenticated;
      }

    2.另外一种是直接在 @interface : NSObject{}括号之后,用 @property 去定义一个变量。
    [objc]@property (assign, readonly) BOOL gameCenterAvailable;[/objc]
    你会发现,有人会再@interface中定义了变量后,又在 @property中重复定义相同的变量,而且很常见。
    结果可能是这样:

    1
    2
    3
    4
    5
    @interface GCTurnBasedMatchHelper : NSObject {
    BOOL gameCenterAvailable;
    BOOL userAuthenticated;
     }
    @property (assign, readonly) BOOL gameCenterAvailable;

    1. 只在@interface中定义变量的话,你所定义的变量只能在当前的类中访问,在其他类中是访问不了的;而用@property声明的变量可以在外部访问。

    2.用了@property去声明的变量,可以使用“self.变量名”的方式去读写变量。而用@interface的方式就不可以。

    3.

    • 使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
    • 使用copy: 对NSString
    • 使用retain: 对其他NSObject和其子类

       @property(retain,nonatomic)UILabel *text;

    •   retain 通知编译器向分配给此属性的对象发送一个保留信息。这将确保底层的实例变量不会从内存中清除。
    • nonatomic  原子属性,多线程时使用,用于读写的唯一性。
    • 声明property的语法为:@property (参数1,参数2) 类型 名字;

       
      1. @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: 禁止多线程,变量保护,提高性能

     首先,我们看atomic 与nonatomic的区别与用法,讲之前,我们先看下面这段代码:

    复制代码
    @property(nonatomic, retain) UITextField *userName;    //1

    @property(nonatomic, retain,readwrite) UITextField
    *userName; //2

    @property(atomic, retain) UITextField
    *userName; //3

    @property(retain) UITextField
    *userName; //4

    @property(atomic,assign)
    int i; // 5

    @property(atomic)
    int i; //6
    @property int i;               //7
    复制代码

      请读者先停下来想一想,它们有什么区别呢?

      上面的代码1和2是等价的,3和4是等价的,5,6,7是等价的。也就是说atomic是默认行为,assign是默认行为,readwrite是默认行为。但是,如果你写上@property(nontomic)NSString *name;那么将会报一个警告,如下图:

      因为是非gc的对象,所以默认的assign修饰符是不行的。那么什么时候用assign、什么时候用retain和copy呢?推荐做法是NSString用copy,delegate用assign(且一定要用assign,不要问为什么,只管去用就是了,以后你会明白的),非objc数据类型,比如int,float等基本数据类型用assign(默认就是assign),而其它objc类型,比如NSArray,NSDate用retain。

  • 相关阅读:
    【LeetCode】589.N叉树的前序遍历(递归+迭代,java实现,详细分析)
    百度网盘偷偷更新,终于实现免费不限速了!
    如何调整DOS窗口的宽高
    输入adb shell 时 提示error: more than one device and emulator
    logcat不显示信息
    安卓打开File Explorer里面不显示内容
    android查看源码的时候看不了
    This version of the rendering library is more recent than your version of ADT plug-in. Please update
    eclipse或者AS链接手机真机之后,logcat里面日志信息乱跳
    Android ADB使用之详细篇
  • 原文地址:https://www.cnblogs.com/sgdkg/p/2782896.html
Copyright © 2020-2023  润新知