zoukankan      html  css  js  c++  java
  • ios @property

    参考资料

    http://blog.csdn.net/pingchangtan367/article/details/14000315

    http://blog.csdn.net/xdrt81y/article/details/9720121

    首先 @property 是声明对象用的 看这个列子,

    //in BaseClass.h
    @interface BaseClass : NSObject{
    @public
        NSString *_name;
    }
    @property(nonatomic,copy) NSString *name;
    //in BaseClass.m
    @synthesize name = _name;
    
    @end
    
    BaseClass *base=[[BaseClass allow]init];
    
    base.name(这样的花可以直接引用name)
    
    base._name(这样就是不能直接引用的)

    @property起了一个修饰的作用  至于@property(....) 一系列的参数 就是对当前修饰对象的一个进一步内存上的修饰 

    1.atomic 和 nonatomic

    atomic是默认的属性,表示对对象的操作属于原子操作,主要是在多线程的环境下,提供多线程访问的安全。我们知道在多线程的下对对象的访问都需要先上锁访问后再解锁,保证不会同时有几个操作针对同一个对象。如果编程中不涉及到多线程,不建议使用,因为使用atomic比nonatomic更耗费系统资源。

    nonatomic 表示访问器的访问不是原子操作,不支持多线程访问安全,但是访问性能高。

     2.readwrite 和readonly

    readwrite 是默认的属性,表示可以对对象进行读和写,会生成对象相应的setter和getter方法。

    readonly 表示只允许读取对象的值,只会生成对象的getter方法。

    3.retain,assign和copy

    retain 表示对NSObject和及其子类对象release旧值,再retain新值,使对象的应用计数增加一。

    此属性只能使用于obejective-c类型对象,而不能用于Core Foundation对象。(retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数,把对象添加到数组中时,引用计数将增加1)。

    - (void) setOldValue: (NSString*) newValue {

        if (newValue !=oldValue) {

            [oldValue release];

            oldValue = [newValue retain];

        }

    }

    assign 是默认属性,只可以对基本数据类型(如CGFloat,NSInteger,Bool,int,代理对象)等使用。该方式会对对象直接赋值而不会进行retain操作。

    copy 表示重新建立一个新的计数为1的对象,然后释放掉旧的值。

    都知道retain是对指针的拷贝,copy是对内容的拷贝。比如:NSString 对象的地址为0x100,其内容为“string”,如果使用copy到另外一个NSString对象,则会生成另外一个地址为0x110的对象,只不过内容仍然是‘string“。如果使用retain到另外一个NSString对象,则该对象的地址仍然为0x100,只不过该对象的计数变为2.

    4.strong 和 weak

    在ARC的模式下,对象声明时需要加入strong和weak,方便内存的自动管理。默认情况下是strong类型。

    strong 强引用,默认的属性,类似于retain,其实是一个相对的概念,就是一个引用。如果有一个强引用持有该对象,则该对象就不能被释放。默认的所有实例变量和局部变量都是strong指针。

    weak 弱引用,类似于assign,弱引用除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数个若引用,只要没有强引用指向他,那麽其还是会被清除,它不是对象的拥有者。其值会在对象被释放后自动设置为nil。

    weak指针主要用于“父-子”关系,父亲拥有一个儿子的strong指针,因此父亲是儿子的所有者;但为了阻止所有权循环,儿子需要使用weak指针指向父亲。典型例子是delegate模式,你的ViewController通过strong指针(self.view)拥有一个UITableView, UITableView的dataSource和delegate都是weak指针,指向你的ViewController。

    那么看看@property究竟干了什么??

    还是上面的Demo;
    @interface BaseClass : NSObject{
    @public
        NSString *_name;
    }
    //@property(nonatomic,copy) NSString *name;
    
    -(NSString*) name;
    -(void) setName:(NSString*)newName;
    @end
    
    把@property的定义注释掉了,另外定义了两个函数,name和setName,下面请看实现文件:
    
    
    //@synthesize name = _name;
    
    -(NSString*) name{
        return _name;
    }
    
    -(void) setName:(NSString *)name{
        if (_name != name) {
            [_name release];
            _name = [name copy];
        }
    }
    
    现在,你再编译运行,一样工作的很好。why?因为我刚刚做的工作和先前声明@property所做的工作完全一样。@prperty只不过是给编译器看的一种指令,它可以编译之后为你生成相应的getter和setter方法。而且,注意看到面property(nonatomic,copy)括号里面这copy参数了吗?它所做的事就是_name = [name copy];或者上面一系列的参数

    Property定义:@property 声明用于自动创建property属性变量的getter和setter
    Synthesize定义:@Synthesize声明实现了property属性变量的getter和setter。 

  • 相关阅读:
    EF
    采用什么架构,才能够承受大访问量
    13个MVC的扩展
    c#与.NET的区别
    整合Spring.net到asp.net网站开发中初探
    C#多线程编程简述
    ASP.NET页面传值的几种方式
    正则RegEXp
    C#中Cache用法
    c#程序将excel文件转换成xml文件
  • 原文地址:https://www.cnblogs.com/yujian-bcq/p/4966501.html
Copyright © 2011-2022 走看看