Objective-C学习之@property

54 篇文章 51 订阅 ¥9.90 ¥99.00

简介

       @property是声明属性的语法,它可以快速方便的为实例变量创建存取器,并允许我们通过点语法使用存取器。

       直接在类的声明中可以通过@property生成setter 和 getter 方法的声明和实现,同时它还生成一个私有的成员变量 _属性名称

       存取器(accessor):指用于获取和设置实例变量的方法。用于获取实例变量值的存取器是getter,用于设置实例变量值的存取器是setter。

@property的特性

       @property还有一些关键字,它们都是有特殊作用的,比如上述代码中的nonatomicstrong

 1. @property(nonatomic,strong) NSString *carName;
 2. @property(nonatomic,strong) NSString *carType;

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

       1. 原子性
       atomic(默认):atomic意为操作是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的,至少在当前的存取器上是安全的。它是一个默认的特性,但是很少使用,因为比较影响效率,这跟ARM平台和内部锁机制有关。

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

       2. 存取器控制

       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;

       3. 内存管理

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

       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:在setter方法中,需要对传入的对象进行引用计数加1的操作。

       简单来说,就是对传入的对象拥有所有权,只要对该对象拥有所有权,该对象就不会被释放。如下代码所示:

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

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

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

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

       注:weak关键字是iOS5引入的,iOS5之前是不能使用该关键字的。delegate 和 Outlet 一般用weak来声明。

       copy:与strong类似,但区别在于实例变量是对传入对象的副本拥有所有权,而非对象本身。

       instancetype,表示某个方法返回的未知类型的Objective-C对象。作用就是使那些非关联返回类型的方法返回所在类的类型

       @synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改。这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。 一般在公用变量的时候使用,如单例模式或者操作类的static变量中使用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值