Object-c @property与@synthesize的配对使用。
功能:让编译器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。
如:
1、在头文件中:
@property int count;
等效于在头文件中声明2个方法:
- (int)count;
-(void)setCount:(int)newCount;
2、实现文件(.m)中
@synthesize count;
等效于在实现文件(.m)中实现2个方法:
- (int)count
{
return count;
}
-(void)setCount:(int)newCount
{
count = newCount;
}
以上等效的函数部分由编译器自动帮开发者填充完成,简化了编码输入工作量。
格式:
声明property的语法为:@property (参数1,参数2) 类型 名字;
如:
@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、
@property(nonatomic,retain)test* thetest;
@property(nonatomic ,copy)test* thetest;
等效代码:
-(void)thetest
{
return thetest;
}
2、
@property(retain)test* thetest;
@property(copy)test* thetest;
等效代码:
-(void)thetest
{
[thetest retain];
return [thetest autorelease];
}
setter分析:
1、
@property(nonatomic,retain)test* thetest;
@property(retain)test* thetest;
等效于:
-(void)setThetest:(test *)newThetest {
if (thetest!= newThetest) {
[thetestrelease];
thetest= [newThetest retain];
}
}
2、
@property(nonatomic,copy)test* thetest;
@property(copy)test* thetest;
等效于:
-(void)setThetest:(test *)newThetest {
if (thetest!= newThetest) {
[thetest release];
thetest= [newThetest copy];
}
}
nonatomic
如果使用多线程,有时会出现两个线程互相等待对方导致锁死的情况(具体可以搜下线程方面的注意事项去了解)。在没有(nonatomic)的情况下,即默认(atomic),会防止这种线程互斥出现,但是会消耗一定的资源。所以如果不是多线程的程序,打上(nonatomic)即可
retain
代码说明
如果只是@property NSString*str; 则通过@synthesize自动生成的setter代码为:
-(void)setStr:(NSString*)value{
str=value;
}
如果是@property(retain)NSString*str; 则自动的setter内容为:
-(void)setStr:(NSString*)v{
if(v!=str){
[str release];
str=[v retain];
}
}
所有者属性
我们先来看看与所有权有关系的属性,关键字间的对应关系。
属性值 | 关键字 | 所有权 |
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 一致;只是可读性更强一些。
Object-c @property与@synthesize的配对使用。的更多相关文章
- Objective-C中的@property和@synthesize用法
@代表“Objective-C”的标志,证明您正在使用Objective-C语言 Objective-C语言关键词,@property与@synthesize配对使用. 功能:让编译好器自动编写一个与 ...
- Objective-c @property和@Synthesize
在Objective-c中,使用@property来标识属性(一般是实例变量).在实现文件中使用@synthesize标识所声明的变量,让系统自动生成设置方法和获取方法. 也就是说@property和 ...
- @property、@synthesize和dynamic的用法
原文: http://blog.csdn.net/hherima/article/details/8622948 @代表“Objective-C”的标志,证明您正在使用Objective-C语言 O ...
- JS - Object and Property的删除用法
在JS中,Object和Property的删除用法: var myObject = {name:'jimmy', age:12, height:123} delete myObject["j ...
- @property和@synthesize的特性
基础回顾:get方法和set方法 定义类成员变量时,可以在@interface中定义,也可以在@implementation中定义: 在@interface中声明,成员变量的状态是受保护的,即“@pr ...
- iOS 详细解释@property和@synthesize关键字
/** 注意:由@property声明的属性 在类方法中通过下划线是获取不到的 必须是通过 对象名.属性 才能获取到!- @property和@synthesize关键字是针对成员变量以及get/se ...
- OC中两个关键字的作用:@property和@synthesize
两个关键字的使用:@property和@synthesize 一.@property关键字这个关键字是OC中能够快速的定义一个属性的方式,而且他可以设置一些值,就可以达到一定的效果,比如引用计数的问题 ...
- OC语法5——@property和@synthesize
@property和@synthesize: 我们回想一下: 在OC中我们定义一个Student类需要两个文件Student.h 和 Student.m. Student.h(声明文件):定义成员变量 ...
- Objective-C基础笔记(2)@property和@synthesize
先贴出使用@property和@synthesize实现的上一篇中的代码,再解释这两个keyword的使用方法和含义,代码例如以下: Person.h文件 #import <Foundation ...
随机推荐
- [UE4]虚幻4蓝图使用小技巧
不得不说,虚幻的蓝图系统还是非常方便强大的,大大的提高了开发效率.蓝图是一个很成熟的系统,也就有很多隐藏的小技巧,这些技巧谈不上多高深,却可以使人们在使用蓝图时更加得心应手,更加喜爱这个“可视化编程“ ...
- F5负载均衡原理(转载)
https://blog.csdn.net/panxueji/article/details/42647193 一. 负载均衡技术 负载均衡技术在现有网络结构之上提供了一种廉价.有效.透明的方法,来扩 ...
- but was actually of type 'com.sun.proxy.$Proxy101' 注入问题
最近在用springboot搭建项目框架时,遇到了如下错误,查询了一番,原来是没有引入spring框架的aop包导致: 问题: ERROR o.s.test.context.TestContextMa ...
- sas 批量处理缺少缺失值
DATA S.customer_grade; SET S.customer_grade; ARRAY NUM{*} _NUMERIC_; DO I=1 TO DIM(NUM); ...
- servlet和jsp概述
1.servlet的作用 B/S系统:浏览器/服务器(Servlet的服务模式) Servlet是运行在web服务器或应用服务器上的java程序,它是一个中间层,负责连接来自web浏览器或其它HTTP ...
- web端文字转语音的几种方案
最近在开发一个微信排队取号的的系统,其中对于服务员端(管理端) 需要有呼叫功能,即点按钮 就播出"xxx号顾客请就座"的声音. 经过在网上一番搜索研究,web端实现指定文字的语音播 ...
- python脚本参数传递
环境:python 库:optparse 效果:python xxx.py -parameter1 参数1 -parameter2 参数2 .... 废话少说,直接上代码ok? xxx.py ...
- springboot通过poi导出excel
Maven引入依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi< ...
- Tomcat启动报错:Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies
错误代码如下: Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for ...
- xshell 设置右键粘贴
1.打开Xshell,单击菜单栏的Tools(工具),选中Options(菜单),进入参数设置界面.. 2. 选择Keyboard and Mouse (键盘和鼠标),把Right-bottox(向右 ...