zoukankan      html  css  js  c++  java
  • iOS开发之property属性介绍

    大家都知道@property和@synthesize可以自动生成某个类成员变量的存取方法,但可能对property中的一些属性不是很了解,网上的一些介绍有的不是很正确,感觉会误导新手,于是准备详细介绍一下property中的详细属性。

    注意:LLVM4之后出现了一个很赞的功能,就是如果声明了属性之后,在没有声明实例变量的情况下会自动合成实例变量,实例变量默认以下划线开头。

    先介绍一下默认的情况:

    readwrite:这个属性是默认的情况,会自动为你生成存取器

    assign:这个属性一般用来处理基础类型,比如int、float等等,如果你声明的属性是基础类型的话,assign是默认的,你可以不加这个属性

    对于assign来说,他的存取器代码是这样的:

    @property (nonatomic, assign) NSString* myField

    - (NSString*) myField {
        return myField;
    }

    - (void) setMyField: (NSString*) newValue {
        myField = newValue;
    }

    natomic:默认是有该属性的,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。

    然后说一下其他的情况:

    readonly:只生成getter不会有setter方法

    copy:这个会自动生成你赋值对象的克隆,相当于在内存中新生成了该对象的副本,这样一来,改变赋值对象就不会改变你声明的这个成员变量了

    retain:会自动retain赋值对象,具体实现如下:

    @property (nonatomic, retain) NSString* myField

    - (NSString*) myField {
        return myField;
    }

    - (void) setMyField: (NSString*) newValue {
        if (newValue !=myField) {
            [myField release];
            myField = [newValue retain];
        }
    }

    可见首先要判断一下当前myField是否就是新赋值来的对象,如果不是要将自己release掉,之后才会进行赋值及retain。

    nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。

  • 相关阅读:
    "Coding Interview Guide" -- 删除无序单链表中值重复出现的节点
    "Coding Interview Guide" -- 设计一个有getMin功能的栈
    "Coding Interview Guide" -- 仅用递归函数和栈操作逆序一个栈
    "Coding Interview Guide" -- 猫狗队列
    "Coding Interview Guide" -- 阶乘
    "Coding Interview Guide" -- 不用额外变量交换两个整数的值
    IDEA问题
    JAVA
    Log4j
    MAVEN教程
  • 原文地址:https://www.cnblogs.com/zhangmangyuan/p/property.html
Copyright © 2011-2022 走看看