@代表“Objective-C”的标志,证明您正在使用Objective-C语言

Objective-C语言关键词,@property与@synthesize配对使用。

功能:让编译好器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。

如:

1、在头文件中:

C代码  
  1. @property int count;

等效于在头文件中声明2个方法:

C代码  
  1. - (int)count;
  2. -(void)setCount:(int)newCount;

2、实现文件(.m)中

C代码  
  1. @synthesize count;

等效于在实现文件(.m)中实现2个方法。

C代码  
  1. - (int)count
  2. {
  3. return count;
  4. }
  5. -(void)setCount:(int)newCount
  6. {
  7. count = newCount;
  8. }

以上等效的函数部分由编译器自动帮开发者填充完成,简化了编码输入工作量。

格式:

声明property的语法为:@property (参数1,参数2) 类型 名字;

如:

C代码  
  1. @property(nonatomic,retain) UIWindow *window;

其中参数主要分为三类:

读写属性: (readwrite/readonly)

setter语意:(assign/retain/copy)

原子性: (atomicity/nonatomic)

各参数意义如下:

readwrite: 产生setter\getter方法

readonly: 只产生简单的getter,没有setter。

assign: 默认类型,setter方法直接赋值,而不进行retain操作

retain: setter方法对参数进行release旧值,再retain新值。

copy: setter方法进行Copy操作,与retain一样

nonatomic: 禁止多线程,变量保护,提高性能

参数类型

参数中比较复杂的是retain和copy,具体分析如下:

getter 分析

1、

C代码  
  1. @property(nonatomic,retain)test* thetest;
  2. @property(nonatomic ,copy)test* thetest;

等效代码:

C代码  
  1. -(void)thetest
  2. {
  3.   return thetest;
  4. }

2、

C代码  
  1. @property(retain)test* thetest;
  2. @property(copy)test* thetest;

等效代码:

C代码  
  1. -(void)thetest
  2. {
  3. [thetest retain];
  4. return [thetest autorelease];
  5. }

setter分析

1、

C代码  
  1. @property(nonatomic,retain)test* thetest;
  2. @property(retain)test* thetest;

等效于:

C代码  
  1. -(void)setThetest:(test *)newThetest {
  2. if (thetest!= newThetest) {
  3.         [thetestrelease];
  4.         thetest= [newThetest retain];
  5. }
  6. }

2、

C代码  
  1. @property(nonatomic,copy)test* thetest;
  2. @property(copy)test* thetest;

等效于:

C代码  
  1. -(void)setThetest:(test *)newThetest {
  2. if (thetest!= newThetest) {
  3.         [thetest release];
  4.         thetest= [newThetest copy];
  5. }
  6. }

nonatomic

如果使用多线程,有时会出现两个线程互相等待对方导致锁死的情况(具体可以搜下线程方面的注意事项去了解)。在没有(nonatomic)的情况下,即默认(atomic),会防止这种线程互斥出现,但是会消耗一定的资源。所以如果不是多线程的程序,打上(nonatomic)即可

retain

代码说明

如果只是@property NSString*str; 则通过@synthesize自动生成的setter代码为:

C代码  
  1. -(void)setStr:(NSString*)value{
  2. str=value;
  3. }

如果是@property(retain)NSString*str; 则自动的setter内容为:

C代码  
  1. -(void)setStr:(NSString*)v{
  2. if(v!=str){
  3. [str release];
  4. str=[v retain];
  5. }
  6. }

所有者属性

我们先来看看与所有权有关系的属性,关键字间的对应关系。

属性值 关键字 所有权

strong __strong
weak __weak
unsafe_unretained __unsafe_unretained
copy __strong
assign __unsafe_unretained
retain __strong

strong

该属性值对应 __strong 关键字,即该属性所声明的变量将成为对象的持有者。

weak

该属性对应 __weak 关键字,与 __weak 定义的变量一致,该属性所声明的变量将没有对象的所有权,并且当对象被破弃之后,对象将被自动赋值nil。

并且,delegate 和 Outlet 应该用 weak 属性来声明。同时,如上一回介绍的 iOS 5 之前的版本是没有 __weak 关键字的,所以 weak 属性是不能使用的。这种情况我们使用 unsafe_unretained。

unsafe_unretained

等效于__unsafe_unretaind关键字声明的变量;像上面说明的,iOS 5之前的系统用该属性代替 weak 来使用。

copy

与 strong 的区别是声明变量是拷贝对象的持有者。

assign

一般Scalar Varible用该属性声明,比如,int, BOOL。

retain

该属性与 strong 一致;只是可读性更强一些。

转载于:https://www.cnblogs.com/facial/p/4388484.html

Objective-C中的@property和@synthesize用法相关推荐

  1. Objective-C Property 和 Synthesize

    为什么80%的码农都做不了架构师?>>>    Objective-C中的@property.@synthesize及点语法都是与两个函数有关的,一是setter函数,另一个是get ...

  2. IOS第三天(@property与@synthesize的用法)

    一.@property与@synthesize基本规范用法 1.@property 当编译器遇到@property时,会自动展开成getter和setter的声明 #import <Founda ...

  3. Objective-C @property和@synthesize

    Objective-C中的特性@property和@synthesize 1. "@property"功能是声明当前属性为编译器自动生成set/get 方法 2. "@s ...

  4. @property与@synthesize的差别

    上一篇文章我有讲到self.与_的差别,往往和这个问题相伴随的是我困惑的问题是"@property与@synthesize的差别" @property的使用方法 @interfac ...

  5. Objective-C中的@property

    1.@property是什么 @Property是声明属性的语法,它可以快速方便的为实例变量创建存取器,并允许我们通过点语法使用存取器. 存取器(accessor):指用于获取和设置实例变量的方法.用 ...

  6. 关于@property的一些用法

    最近在重新巩固Python,看了<Effective Python>这本书,感觉不错,查漏补缺. 其中@property这个属性有必要做一下笔记: 我们熟悉了Java或者C++语法,一般对 ...

  7. Objective-C 点语法 成员变量的作用域 @property和@synthesize关键字 id类型

    点语法 1.利用点语法替换set方法和get方法 方法调用 Student *stu = [Student new]; [stu setAge : 18]; int age = [stu age]; ...

  8. 属性详解(@property/@dynamic/@synthesize)

    上一篇文章讲到, OC 2.0之后属性一旦声明,如果没有readonly修饰的话,当前类自动生成了setter和getter方法的声明, 并且会自动生成对应的实例变量(下划线 + 属性名).而sett ...

  9. @ini_get php,php中get_cfg_var()和ini_get()的用法及区别_php技巧_脚本之家

    本文实例讲述了php中get_cfg_var()和ini_get()的用法及区别.分享给大家供大家参考.具体分析如下: php里get_cfg_var()和ini_get()都是取得配置值的函数,当你 ...

最新文章

  1. 用vs2005 开发arcims htmlViewer
  2. C++手册_迅为干货 | C程序调用shell
  3. ajax提交后立刻刷新,Ajax提交表单页面刷新很快的解决方法
  4. V-rep对UR3机械臂仿真路径规划
  5. sql获取oracle数据库数据,通过sql语句获取数据库的基本信息
  6. 趣图:你能Get到笑点么?
  7. 2005级计算机系本二班专业知识大赛
  8. transformer模型_【预训练模型】万字长文梳理NLP预训练模型!从transformer到albert...
  9. mybatis No enum const class org.apache.ibatis.type.JdbcType.Date 坑爹的配置
  10. 路由器长期通电好不好?
  11. 基于深度学习的大豆病虫害自动计数(SLIC超像素方法进行图像分割)
  12. 既然有http 请求,为什么还要用rpc调用?
  13. 生信搬运工-02-sra文件的下载
  14. 如何用OpenCV给图片加上文字?
  15. 数字图像处理复习总结
  16. 前端UI框架ligerui表格汇总功能无法计算全部数据的合计的解决方法
  17. Python 爬虫入门(二)——爬取妹子图
  18. 第一次改变root密码_密码学永远改变的一天
  19. JAVA实现PDF无损转WORD
  20. Jena_1 Jena 与 Fuseki部署

热门文章

  1. PHP从零开始--数据库
  2. CSS3笔记之定位篇(二)z-index
  3. 算法 --- 回溯法
  4. react --- render持续调用解决方案
  5. Python与操作系统有关的模块
  6. 内存管理1retain和release
  7. leetcode21
  8. 基于百度地图js进行地理定位
  9. Oracle以SQL方式导出导入(转移)数据
  10. There is no public key available for the following key IDs: 3B4FE6ACC0B21F32