OC:属性详解☀️

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。
在开发过程中经常要用到定义属性,@property@synthesize是经常用到的关键字,那么到底该如何正确定义一个属性呢,我们需要了解其中用到的关键字。

atomic: 原子操作(原子性是指事务的一个完整操作,操作成功就提交,反之就回滚. 原子操作就是指具有原子性的操作)在objective-c 属性设置里面默认的就是atomic,意思就是setter/getter函数是一个原子操作,如果多线程同时调用setter时,不会出现某一个线程执行完setter所有语句之前,另一个线程就开始执行setter,相当于函数头尾加了锁. 这样的话并发访问性能会比较低.

nonatomic: 非原子操作 一般不需要多线程支持的时候就用它,这样在并发访问的时候效率会比较高. 在objective-c里面通常对象类型都应该声明为非原子性的. iOS中程序启动的时候系统只会自动生成一个单一的主线程.程序在执行的时候一般情况下是在同一个线程里面对一个属性进行操作. 如果在程序中我们确定某一个属性会在多线程中被使用,并且需要做数据同步,就必须设置成原子性的,但也可以设置成非原子性的,然后自己在程序中用加锁之类的来做数据同步.通常说nonatomic 是提高在非多线程应用中的读写效率.

在头文件中声明属性的时候使用atomicnonatomic等价于在头文件里面添加2个函数一个是用于设置这个属性的,一个是用于读取这个属性,例如:- (nsstring *)name; - (void)setName:(NSString *)str;
atomic / nonatomic 需要和@synthesize/@dynamic配和使用才有意义.

@synthesize 如果不实现settergetter方法,编译器将会自动在生产settergetter方法。

@dynamic 表示变量对应的属性访问器方法,是动态实 现的,你需要在NSObject 中继承而来的+(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定动态实现的方法或者函数。

属性修饰其他关键字:
getter=getterName;
指定get方法,并需要实现这个方法。必须返回与声明类型相同的变量,没有参数
setter=setterName;
指定set方法,并需要实现这个方法。带一个与声明类型相同的参数,没有返回值(返回空值)
当声明为readonly的时候,不能指定set方法
readwrite
如果没有声明成readonly,那就默认是readwrite。可以用来赋值,也可以被赋值
readonly
不可以被赋值
assign
所有属性都默认assign,通常用于标量(简单变量 int, float,CGRect等),只是简单的传递指针.
一种典型情况是用在对对象没有所有权的时候,通常是delegate,避免造成死循环(如果用retain的话会死循环)
retain
属性必须是objc对象,拥有对象所有权,必须在dealloc中release一次,是在传递指针后 retainCount +1。
copy
属性必须是objc对象,拥有对象所有权,必须在dealloc中release一次。且属性必须实现NSCopying协议
一般常用于NSString类型,是创建分配一个新的空间,从原址的内容复制内容过来.```
 
######dealloc 后relase的事情,建议是在每个 object的 m文件里 成对的创建和销毁变量.谁创建,谁负责销毁,谁retain 谁来release.


#####`@property`是一个属性访问声明,扩号内支持以下几个属性:

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

@synthesize xxx; 为这个新属性自动生成读写函数;

如果你不懂怎么使用他们,那么就这样 ->
使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
使用copy: 对NSString
使用retain: 对其他NSObject和其子类

当你定义了一系列的变量时,需要写很多的gettersetter方法,而且它们的形式都是差不多的,,所以Xcode提供了@property@synthesize属性,@property用在 .h 头文件中用作声明,@synthesize用在.m 文件中用于实现。
如下,新建一个基于“Command Line Tool”的项目,名为“property”,再新建一个Student类,传统的写法是:

Student.h

//  
//  Student.h  
//  property  
//  
//  Created by Biao on 16-4-22.  
//  Copyright (c) 2016年 Biao. All rights reserved.  
//  
  
#import <Foundation/Foundation.h>  
  
@interface Student : NSObject  
{  
    int age;  
    int no;  
}  
  
//age的getter和setter方法声明  
- (int)age;  
- (void)setAge:(int)newAge;  
  
//no的getter和setter方法声明  
- (int)no;  
- (void)setNo:(int)newNo;  
  
@end  


Student.m


//  
//  Student.m  
//  property  
//  
//  Created by Biao on 16-4-22.  
//  Copyright (c) 2016年 Biao. All rights reserved.  
//  
  
#import "Student.h"  
  
@implementation Student  
  
//age的getter和setter方法的实现  
- (int)age  
{  
    return age;  
}  
-(void)setAge:(int)newAge  
{  
    age = newAge;  
}  
  
//no的getter和setter方法的实现  
- (int)no  
{  
    return no;  
}  
- (void)setNo:(int)newNo  
{  
    no = newNo;  
}  
  
@end  


main.m

//  
//  main.m  
//  property  
//  
//  Created by Biao on 16-4-22.  
//  Copyright (c) 2016年 Biao. All rights reserved.  
//  
  
#import <Foundation/Foundation.h>  
#import "Student.h"   
  
int main(int argc, const char * argv[])  
{  
  
    @autoreleasepool {  
          
        // insert code here...  
        Student *stu = [[Student alloc] init];  
        stu.age = 100;//这句相当于setter方法  
        NSLog(@"age is %i", stu.age);//这里的 stu.age 相当于getter方法            
    }  
    return 0;  
}  ```

>用@property和@synthesize的写法是:

Student.h

//
// Student.h
// property
//
// Created by Biao on 16-4-22.
// Copyright (c) 2016年 Biao. All rights reserved.
//

import <Foundation/Foundation.h>

@interface Student : NSObject
{
int age;
int no;
}

//当编译器遇到@property时,会自动展开成getter和setter的声明
@property int age;
@property int no;

@end

Student.m

//
// Student.m
// property
//
// Created by Biao on 16-4-22.
// Copyright (c) 2016年 Biao. All rights reserved.
//

import "Student.h"

@implementation Student

//@synthesize 会自动生成getter和setter的实现
//@synthesize 默认会去访问age,no,height同名的变量,,
//如果找不到同名的变量,会在内部自动生成一个私有同名变量age,no,height,,
//因此Student.h 中的这几个变量也可以省略不写。
@synthesize age,no;

@end

main.m

//
// main.m
// property
//
// Created by Biao on 16-4-22.
// Copyright (c) 2016年 Biao. All rights reserved.
//

import <Foundation/Foundation.h>

import "Student.h"

int main(int argc, const char * argv[])
{

@autoreleasepool {  
      
    // insert code here...  
    Student *stu = [[Student alloc] init];  
    stu.age = 100;  
    NSLog(@"age is %i", stu.age);  
      
}  
return 0;  

} ```

几点说明:
1.在Xcode4.5及以后的版本中,可以省略@synthesize ,编译器会自动帮你加上getter 和 setter 方法的实现,并且默认会去访问_age这个成员变量,如果找不到_age这个成员变量,会自动生成一个叫做 _age的私有成员变量。
2.建议变量名用"_"前缀作为开头。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容

  • //// @property 、属性、修饰符// Created by mac on 2016/10/30./...
    蓝白七七阅读 1,600评论 1 8
  • 十月去,秋将近。俗语说:“寒露不算冷,霜降变了天”,霜降作为秋季的最后一个节气,过后,就正式入冬了。 一个许久未联...
    可乐别加冰阅读 509评论 0 1
  • 郭相麟 月亮之夜 升起一轮心月 生命的轮回 在转瞬之间 快乐与悲伤 快速的跌宕起伏 那一轮心月的升起 遥望那生命的...
    郭相麟阅读 125评论 0 0
  • 一些经历让我对死亡这个话题很感兴趣。 死亡代表着什么,当一个生命突然消失了,那是什么感觉,那些带有死者标签的物品还...
    Lizol_Zoeshy阅读 230评论 0 0
  • 一、水库人员安排 今天园山街道水库出动管护人员10人次,安保12人次,巡查车辆:摩托车七辆、电动车四辆。重...
    小白_1d34阅读 90评论 0 0