zoukankan      html  css  js  c++  java
  • Objective-C中的@Property具体解释

    Objective-C中的@Property具体解释

    @Property (属性) class vairs

    这个属性有nonatomic。 strong。 weak, retain。 copy等等

    我把它们分为三类,各自是:原子性。存取器控制,内存管理。

    原子性

    • atomic(默认):atomic意为操作是原子的,意味着仅仅有一个线程訪问实例变量。atomic是线程安全的。至少在当前的存取器上是安全的。

      它是一个默认的特性,可是非常少使用,由于比較影响效率,这跟ARM平台和内部锁机制有关。

    • nonatomic:nonatomic跟atomic刚好相反。表示非原子的,能够被多个线程訪问。它的效率比atomic快。但不能保证在多线程环境下的安全性,在单线程和明白仅仅有一个线程訪问的情况下广泛使用。

    存取器控制

    • readwrite(默认):readwrite是默认值。表示该属性同一时候拥有setter和getter。
    • readonly: readonly表示仅仅有getter没有setter。

    有时候为了语意更明白可能须要自己定义訪问器的名字:

    @property (nonatomic, setter = mySetter:,getter = myGetter ) NSString *name;

    最常见的是BOOL类型。比方标识View是否隐藏的属性hidden。能够这样声明:

    @property (nonatomic,getter = isHidden ) BOOL hidden;

    内存管理

    @property有显示的内存管理策略。这使得我们仅仅须要看一眼@property声明就明白它会如何对待传入的值。

    assign

    assign(默认):assign用于值类型。如int、float、double和NSInteger。CGFloat等表示单纯的复制。

    还包含不存在全部权关系的对象,比方常见的delegate。


    @property(nonatomic) int running;
    @property(nonatomic,assign) int running;
    以上两段代码是同样的。

    在setter方法中,採用直接赋值来实现设值操作:

    -(void)setRunning:(int)newRunning{  
        _running = newRunning;  
    } 

    retian

    retian:在setter方法中,须要对传入的对象进行引用计数加1的操作。
    简单来说,就是对传入的对象拥有全部权,仅仅要对该对象拥有全部权,该对象就不会被释放。

    例如以下代码所看到的:

    -(void)setName:(NSString*)_name{  
         //首先推断是否与旧对象一致,假设不一致进行赋值。  
         //由于假设是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时。使此次的set操作让实例name提前释放。而达不到赋值目的。

    if ( name != _name){ [name release]; name = [_name retain]; } }

    copy

    copy:在setter方法中,首先复制传入的參数。然后将原来的旧值release。新的数值复制上去。

     -(void)setName:(NSString*)newName{
    
        if(newName!=name){
            [name release];
            name=[newName  copy];
        }
    }

    注意:Foundation中可复制的对象,当我们copy的是一个不可变的对象的时候。它的作用相当与retain(cocoa做的内存优化)比方我们对NSString进行copy,copy得到的地址是不变的。
    以下四段代码中,第一段显示的结果不会copy,而是retain.

        NSLog(@"====================================================================================");
        NSString *sstr = [NSString stringWithFormat:@"dfa"];
        NSLog(@"strassign:%p,    count:%ld", sstr , [sstr retainCount]);
        NSString *sstr2 = [sstr copy];
        NSLog(@"strassign:%p,    count:%ld", sstr2 , [sstr2 retainCount]);
        NSLog(@"====================================================================================");
    
    
        NSLog(@"====================================================================================");
        NSString *sstr = [NSString stringWithFormat:@"dfa"];
        NSLog(@"strassign:%p,    count:%ld", sstr , [sstr retainCount]);
        NSString *sstr2 = [sstr mutableCopy];
        NSLog(@"strassign:%p,    count:%ld", sstr2 , [sstr2 retainCount]);
        NSLog(@"====================================================================================");
    
    
        NSLog(@"====================================================================================");
        NSMutableString *str = [NSMutableString stringWithFormat:@"dfa"];
        NSLog(@"strassign:%p,    count:%ld", str , [str retainCount]);
        NSMutableString *str2 = [str copy];
        NSLog(@"strassign:%p,    count:%ld", str2 , [str2 retainCount]);
        NSLog(@"====================================================================================");
    
        NSLog(@"====================================================================================");
        NSMutableString *str = [NSMutableString stringWithFormat:@"dfa"];
        NSLog(@"strassign:%p,    count:%ld", str , [str retainCount]);
        NSMutableString *str2 = [str mutableCopy];
        NSLog(@"strassign:%p,    count:%ld", str2 , [str2 retainCount]);
        NSLog(@"====================================================================================");
    

    strong

    strong:strong是在IOS引入ARC的时候引入的关键字,是retain的一个可选的替代。表示实例变量对传入的对象要有全部权关系。即强引用。strong跟retain的意思同样并产生同样的代码。可是语意上更好更能体现对象的关系。

    weak

    weak:在setter方法中。须要对传入的对象不进行引用计数加1的操作,和assign类似。


    简单来说,就是对传入的对象没有全部权,当该对象引用计数为0时,即该对象被释放后。用weak声明的实例变量指向nil,即实例变量的值为0。

    强引用(strong)和弱引用(weak)的一个笑话(便于理解)

    把对象想象成一条狗,它要跑 (be deallocated)。强指针就像一条拴在狗脖子上的狗链。仅仅要攥在手里。狗就跑不了。假设5个人攥着5条狗链都拴着狗 (5个强指针指向对象),除非5条狗链都撒开,狗就跑不了。

    弱指针就像是孩子指着狗喊“看!

    狗!

    ”。仅仅要狗链还拴着狗,孩子就能指着狗喊。

    当全部狗链都撒开,无论有多少孩子指着狗喊。狗都跑了。当最后一个强指针不再指向对象,对象就会被释放,全部弱指针清零。我们什么时候使用弱指针呢?仅仅有当你想避免保留循环 (retain cycles,) 时。我们才使用它。

  • 相关阅读:
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Maximum Depth of Binary Tree
    Sharepoint 2013 创建TimeJob 自动发送邮件
    IE8 不能够在Sharepoint平台上在线打开Office文档解决方案
    TFS安装与管理
    局域网通过IP查看对方计算机名,通过计算机名查看对方IP以及查看在线所有电脑IP
    JS 隐藏Sharepoint中List Item View页面的某一个字段
    SharePoint Calculated Column Formulas & Functions
    JS 两个一组数组转二维数组
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7351041.html
Copyright © 2011-2022 走看看