zoukankan      html  css  js  c++  java
  • ObjecteiveC 属性修饰符

    Objective-C的几个重要的属性修饰符

    1.getter=<name>,setter=<name>:指定该属性所使用的存取器函数的名称

    2.readwrite或者readonly:指定属性是否可读写,默认是读写

    3.assign、retain、copy:决定为该属性生成的赋值函数的类型。assign生成的赋值函数只是简单地为变量进行赋值。retain生成的赋值函数在赋值到变量的时候会保留传入到参数。copy生成的存取函数会复制传入的参数到成员变量。默认值是assign。

    4.nonatomic和atomic:是否是原子性的,默认是atomic的。

    5.@synthesize和@dynamic:@dynamic 就是要来告诉编译器,代码中用@dynamic修饰的属性,其getter和setter方法会在程序运行的时候或者用其他方式动态绑定,以便让编译器通过编译。其主要的作用就是用在NSManageObject对象的属性声明上,由于此类对象的属性一般是从Core Data的属性中生成的,Core Data框架会在程序运行的时候为此类属性生成getter和Setter方法。

    以下转载自http://blog.csdn.net/pjk1129/article/details/6457048#comments

    在iphone程序中,属性合成中的retain/copy/assign有什么区别?

    1)assign就不用说了,因为基本上是为简单数据类型准备的,原子类类型,例如CGPoint、CGFloat等,而不是NS对象们;

    2)retain VS copy

    • copy 建立一个索引计数为1的对象,然后释放旧对象
    • retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

    Copy其实是建立了一个相同的对象,而retain不是:

    比如一个NSString对象,地址为0×1111,内容为@”STR”

    Copy到另外一个NSString之后,地址为0×2222,内容相同,新的对象retain1,旧有对象没有变化

    retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain+1

    也就是说,retain是指针拷贝,copy是内容拷贝。

    ObjectiveC中的copyc++的一样分深拷贝和浅拷贝,怎样区分这两个对象呢?我的理解是:

       (1)深拷贝,就是新拷贝一块内存交给对象使用。

       (2)浅拷贝,就是觉得拷贝内存太浪费,直接给你我的地址吧,相当于retain

    3)怎么区分这两种对象呢?

        ObjectiveC里面只有一种情况是浅拷贝,那就是不可变对象的copy,其它的都是深拷贝(包括不可变对象mutableCopy、可变对象的的copymutableCopy)。

    以下转载自http://hi.baidu.com/yangjunfeng22/item/7507d71a93e79005e65c3693

    nonatimic,retain,assign,copy,readonly,readwrite,这些属性主要事完成getter setter 的操作  (这个很重要的哦 !!!很多初学者都在这里迷惑哦~~~) ------------------------------------------------assign: 简单的赋值  不会更改索引计数(Reference  counting)主要是对基本数据类型使用 eg:(NSInteger,CGFloat 和C语言的 int double float char  ...)如果使用对象类型的参数,需要开启garbage collector[现在的版本叫引用计数器 不同的版本不同的叫法  在mac编程和在iphone编程中的叫法也不同  谅解 谅解 ] retain: 释放旧的对象 将旧对象的值赋予输入对象 并将输入对象的索引计数+1 ,主要应用与NSObject与其子类中,如果启用了garbage collector 和assign 的作用一样 

    1. - (void)setName:(NSString *)newName {  
    2.     if (name != newName) {  
    3.        [name release];  
    4.        name = [newName retain];  
    5.        // name’s retain count has been bumped up by 1  
    6.     }  
    7. }  

    copy: 创建一个索引计数为1的对象 释放掉原来的对象 readonly:  表示只读属性  只会生成getter方法 不会生成setter方法 readwrite:设置可供访问的级别 nonatimic:非原子访问,不加同步 ,多线程并发访问提高性能 (对多线程的保护,防止在未写完,被另一个线程读取,造成数据错误)。对copy 和retain的 解释 上面的语言太抽象了 那么请允许我在这里对 copy 和 retain 的区别 作详细的介绍

    比如一个NSString 对象,地址为0×1111 ,内容为@”STR”

    Copy 到另外一个NSString 之后,地址为0×2222 ,内容相同,新的对象retain为1 ,旧有对象没有变化

    retain 到另外一个NSString 之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1 

    retain 是指针拷贝,copy 是内容拷贝  

    下面分享一个网友的总结

    一直以来个人觉得如果一个类是的property是readonly的那么再指定其他的如assign/retain/copy这样的属性就实在是没有什么意义了。确实你想想既然都readonly了,肯定是没有setter的,既然没有setter那么谈assign/retain/copy又有什么意义呢?所以一直以来我从来不对readonly的property加retain/copy属性申明,默认assign就足够了,simple is beautiful!

    但是我现在发现我错了,其实一直都有一种这种感觉,只是没有找到100%的充分理由为readonly加上retain/copy。但是假如你要在你的subclass改写property,而加入你要改写的是一个NSString,你像把这个属性设置为readwrite和copy,往往杯具就发生了,编译时候可恶的warning 产生了,因为copy和之前默认的assign明显不相同啊!

    终上,不论什么时候,都要为你的readonly的对象属性加上合适的retain/copy申明。你现在不用,但不说明你将来就不会用,出来混迟早都要还的!

    @property (nonatomic,retain)中的nonatom和retain的意思2011年05月15日 星期日 下午 10:12

    http://baike.baidu.com/view/5028218.htm

    retain和copy的区别

    原来简单解释过属性定义(Property) ,并且提起了简单的retain,copy,assign的区别。那究竟是有什么区别呢?

    assign就不用说了,因为基本上是为简单数据类型准备的,而不是NS对象们。

    Retain vs. Copy!!

    • copy : 建立一个索引计数为1的对象,然后释放旧对象
    • retain :释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

    那上面的是什么该死的意思呢?

    Copy其实是建立了一个相同的对象,而retain不是:

    比如一个NSString 对象,地址为0×1111 ,内容为@”STR”

    Copy 到另外一个NSString 之后,地址为0×2222 ,内容相同,新的对象retain为1 ,旧有对象没有变化

    retain 到另外一个NSString 之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1

    也就是说,retain 是指针拷贝,copy 是内容拷贝。哇,比想象的简单多了…

    ------------------------------------------------------------------------------------------------------

    上面这篇文章来自:http://c.gzl.name/archives/339

    自己研究了一下,,上面文章的说法是对的,,但是遗漏了一点东西.

    他说 copy是内容的拷贝  ,对于像NSString,的确是这样.

    但是,如果是copy的是一个NSArray呢?比如,

    NSArray *array = [NSArray arrayWithObjects:@"hello",@"world",@"baby"];

    NSArray *array2 = [array copy];

    这个时候,,系统的确是为array2开辟了一块内存空间,但是我们要认识到的是,array2中的每个元素,,只是copy了指向array中相对应元素的指针.这便是所谓的"浅复制".了解到这一点非常重要....

    常在声明一些成员变量时会看到如下声明方式:

    @property (参数1,参数2) 类型 名字;

    这里我们主要分析在括号中放入的参数,主要有以下三种:

    setter/getter方法(assign/retain/copy)
    读写属性(readwrite/readonly)
    atomicity(nonatomic)

    其中各参数说明如下:

    assign
    默认类型,setter方法直接赋值,而不进行retain操作
    retain
    setter方法对参数进行release旧值,再retain新值,如下代码:

    1. -(void) setObj:(ClassX*) value  
    2. {  
    3.          if (obj != value)  
    4.          {  
    5.                    [obj release];  
    6.                    obj = [value retain];  
    7.          }  

    copy
    setter方法进行Copy操作,与retain一样
    nonatomic

    @property (nonatomic,retain)中的nonatom和retain是什么意思

    @property是一个属性访问声明,扩号内支持以下几个属性:
    1,getter=getterName,setter=setterName,设置setter与getter的方法名
    2,readwrite,readonly,设置可供访问级别
    2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
    3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)
    4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
    5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级。
    @synthesize xxx;  为这个心属性自动生成读写函数;

    如果你不懂怎么使用他们,那么就这样 ->

      • 使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
      • 使用copy: 对NSString
      • 使用retain: 对其他NSObject和其子类
  • 相关阅读:
    加入创业公司有什么利弊
    Find Minimum in Rotated Sorted Array II
    Search in Rotated Sorted Array II
    Search in Rotated Sorted Array
    Find Minimum in Rotated Sorted Array
    Remove Duplicates from Sorted Array
    Spiral Matrix
    Spiral Matrix II
    Symmetric Tree
    Rotate Image
  • 原文地址:https://www.cnblogs.com/xinye/p/2941991.html
Copyright © 2011-2022 走看看