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更耗费系统资源。atom

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

 2.readwrite 和readonly.net

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和setterSynthesize定义:@Synthesize声明实现了property属性变量的getter和setter。 

相关文章
相关标签/搜索