Objective-C中的@property和@synthesize用法

@代表“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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++11编码规范 NULL还是nullptr

0和nullptr/NULL 至于指针(地址值),根据实际选择用0、NULL还是nullptr。对使用了C11特性的项目,选用nullptr;对于C03项目,推荐NULL,因为它像是一个指针转载于:https://www.cnblogs.com/JD85/p/4…

Android用户界面程序设计示例

[例1]按钮和Toast弹出对话框 1 [例2] TextView文本框 (1) 3 [例3]TextView文本框 (2) 4 [例4]编辑框EditText 4 [例5]单选RadioButton 6 [例6]Toast的用法简介 8 [例7]多选checkbox 12 [例8]菜单Menu 14 …

innerText,outerText,innerHTML,outerHTML区别

document.body.innerHTML; innerText,outerText,innerHTML,outerHTML资料outerHTML:标签对象外部的HTML文本(包括该标签) innerHTML:标签对象内部的HTML文本(不包括该标签) innerText: 标签对象内部的…

Ubuntu安装adobe字体

Ubuntu的字体目录存放在/usr/share/fonts目录下,可以看到该目录下有4个目录, 12$ ls /usr/share/fonts/cmap truetype type1 X11我们在truetype目录下新建一个adobe的目录来存放需要安装的Adobe中文字体,并把已经下载好的字体复制到该目录…

Spring Thread Pool 线程池的应用

Spring and Java Thread example 扫扫关注“茶爸爸”微信公众号坚持最初的执着,从不曾有半点懈怠,为优秀而努力,为证明自己而活。Download it – Spring-Thread-Example.zip (22 KB)转自:http://www.mkyong.com/spring/spring-and…

数据库操作类型简介

SQL语言大体上可以分为四大类: 数据查询语言(DQL),数据操纵语言(DML),数据定义语言(DDL),数据控制语言(DCL)。 1. 数据查询语言DQL数…

Emule使用Upnp,解决Lowid和port not reachable的问题

路由器上钩选开启Upnp Emule->选择->扩展选项->Upnp, 服务器:【从URL更新】http://upd.emule-security.org/server.met转载于:https://www.cnblogs.com/zhyong/p/4422139.html

Longest Palindromic Substring

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 题目描述很简单,就是寻找一个字符串的最大回文。 1.暴力搜索 穷举所有的可能…

Integer 中的缓存类IntegerCache

2014年去某公司笔试的时候遇到这么一道题: public class Test {public static void main(String[] args) {Integer int1 Integer.valueOf("100");Integer int2 Integer.valueOf("100");System.out.println(int1 int2);} } 问打印的结果的多少…

Android动画及滑动事件冲突解决(转载)

原文链接:http://blog.csdn.net/singwhatiwanna/article/details/38168103 Android开发中动画和事件处理是程序员迈向高手的必经之路,也是重点和难点。 此篇转载文章思路清晰,结构合理,用图文混合的方式完美的讲解了动画和事件冲突…

在main函数前后执行的函数之 C语言

在gcc中&#xff0c;可以使用attribute关键字&#xff0c;声明constructor和destructor&#xff0c;来指定了函数在main之前或之后运行,代码如下&#xff1a; 1 #include <stdio.h>2 3 __attribute((constructor)) void before_main()4 {5 printf("%s/n",_…

VSTO开发,转帖

http://www.cnblogs.com/oneivan/p/4243574.html转载于:https://www.cnblogs.com/xianerwonder/p/4432595.html

PowerDesigner的汉化破解安装到逆向工程(ORACLE)

一、软件安装 1、下载软件并安装安装16.5汉化版下载地址&#xff1a;真正的汉化-PowerDesigner 16.5 汉化&#xff08;包含安装文件和汉化文件&#xff09; 破解包下载地址&#xff1a;PowerDesigner V16.5 安装文件 及 破解文件 &#xff08;包含安装文件和破解文件&#xff0…

JAVA开发随记

想到一点写一点&#xff0c;遇到一点补充一点。 1、成员变量 在定义成员变量时尽量不要直接赋值&#xff0c;最好是在初始化信息的时候进行赋值操作。如果需要在属性定义的时候进行赋值&#xff0c;那么请用final修饰该属性。错误实例 class A extends B {/** 到期日距离当前…

PHP反射ReflectionClass、ReflectionMethod 入门教程

PHP反射ReflectionClass、ReflectionMethod 入门教程 作者&#xff1a;SNSGOU 发布于&#xff1a;2014-03-16 16:44:00 分类&#xff1a;PHP 浏览(6145) PHP5 具有完整的反射API&#xff0c;添加对类、接口、函数、方法和扩展进行反向工程的能力。 反射是什么&#xff…

Oracle开发常用知识

一、利用游标实现循环嵌套 在对oracle数据进行操作时我们会经常碰到循环甚至循环嵌套的情况。这个时候游标的作用就体现出来了。 DECLAREvId NUMBER(19);vDate DATE;--a表游标定义CURSOR a_cursor ISSELECT DISTINCT o.employeeId FROM operations o WHERE o.employeeId IS N…

条件控制(if ) ( case)

一&#xff1a;IF应用格式 (1)                  (2)                (3) IF 条件 THEN           IF 条件 THEN            IF 条件1 THEN --代码块               --代码块          …

使用临时表解决union和order by不能同时使用的问题

最近遇见了这样一个问题&#xff0c;有4张表&#xff0c;A&#xff08;单据&#xff09;表&#xff0c;B&#xff08;产品&#xff09;表&#xff0c;C&#xff08;产品类型&#xff09;&#xff0c;D&#xff08;单据产品关联表&#xff09;。 B表有唯一对应的类型C&#xff…

2.3线性表的链式存储和运算—双向链表

以上讨论的单链表的结点中只有一个指向其后继结点的指针域next&#xff0c;因此若已知某结点的指针为p&#xff0c;其后继结点的指针则为p->next &#xff0c;而找其前驱则只能从该链表的头指针开始&#xff0c;顺着各结点的next 域进行&#xff0c;也就是说找后继的时间性能…

Oracle常用字符串操作

参考&#xff1a; 一、oracle操作字符串&#xff1a;拼接、替换、截取、查找&#xff1b; 二、oracle中的trim函数使用介绍 --字符串去空格 --输出:a b c; SELECT TRIM( a b c ) || ; FROM dual; SELECT TRIM(BOTH FROM a b c ) || ; FROM dual; --输出: a …