原文:  http://blog.csdn.net/hherima/article/details/8622948

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

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

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

如:

1、在头文件中:

  1. @property int count;

等效于在头文件中声明2个方法,即通常说的GetXXX  SetXXX。

  1. - (int)count;  //oc中,getxxx方法被省略为XXX
  2. -(void)setCount:(int)newCount;

使用方法:[self setCount:0];

2、实现文件(.m)中

  1. @synthesize count;

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

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

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

格式:

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

如:

  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

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

等效代码:

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

2、

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

等效代码:

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

setter分析

1、

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

等效于:

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

2、

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

等效于:

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

@synthesize obj=_obj的意义详解

上面代码的意思是:为成员变量_obj起个属性名称叫obj。 这样写是为了区分成员变量_obj和属性名称obj,在.m里面使用的时候见到_objh就知道是成员变量了,见到self.obj就知道是属性了。

另外,系统库中的所有类的声明部分都是这样写的。

总之一句话:区分成员变量名称和属性名称。

下面是一个常见的例子

@interface MyClass:NSObject{

MyObjecct *_myObject;

}

@property(nonamtic, retain) MyObjecct *myObject;

@end

@implementatin MyClass

@synthesize myObject=_myObject;

1.self调用setter方法的方式

ObjectName*  tmp= [[ObjectName alloc] init];

self.nameVarPtr =tmp;                 //retainCount=2

[tmp release];                        //retainCount=1

2.指针赋值方式,不会调用setter方法

nameVarPtr= [[ObjectName alloc] init]; // retainCount=1

两种赋值方式的区别何在呢?

self.nameVarPtr=xxx 这种赋值方式等价于调用 [self setnameVarPtr:xxx],而setnameVarPtr:xxx的方法的实现又是依赖于@property的属性的,比如retain,assign等属性。

nameVarPtr = xxx 的赋值方式,仅仅是对一个指针进行赋值。nameVarPtr仅仅是一个指针变量,记录了xxx的地址。在这个过程中不会调用setter方法,不会调用setter方法,就和@property没有关系,从而,也和retain,assign等属性没有关系。这种赋值方式就是一个简单的指针赋值。

 

@property的属性

nonatomic

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

retain

代码说明

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

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

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

  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 一致;只是可读性更强一些。

@synthesize和@dynamic的异同

一、SDK中描述是在声明property的时候,有2个选择
1:通过@synthesize 指令告诉编译器在编译期间产生getter/setter方法。
2:通过@dynamic指令,自己实现方法。
有些存取是在运行时动态创建的,如在CoreData的NSManagedObject类使用的某些。如果你想这些情况下,声明和使用属性,但要避免缺少方法在编译时的警告,你可以使用@dynamic动态指令,而不是@synthesize合成指令。例如
@interface Demo : NSManagedObject {
}
@property (retain) NSString* test;
@end

@implementation Demo
@dynamic test;
@end

二、

@synthesize will generate getter and setter methods for your property. @dynamic just tells the compiler that the getter and setter methods are implemented not by the class itself but somewhere else (like the superclass)

Uses for @dynamic are e.g. with subclasses of NSManagedObject (CoreData) or when you want to create an outlet for a property defined by a superclass that was not defined as an outlet:

Super class:

@property(nonatomic, retain)NSButton*someButton;
...
@synthesize someButton;

Subclass:

@property(nonatomic, retain)IBOutletNSButton*someButton;
...
@dynamic someButton;

@property、@synthesize和dynamic的用法的更多相关文章

  1. iOS 内存管理-copy、 retain、 assign 、readonly 、 readwrite、nonatomic、@property、@synthesize、@dynamic、IB_DESIGNABLE 、 IBInspectable、IBOutletCollection

    浅谈iOS内存管理机制 alloc,retain,copy,release,autorelease 1)使用@property配合@synthesize可以让编译器自动实现getter/setter方 ...

  2. iOS @property、@synthesize和@dynamic

    @property @property的本质: @property = ivar(实例变量) + getter/setter(存取方法); 在正规的 Objective-C 编码风格中,存取方法有着严 ...

  3. iOS中 @synthesize 和 @dynamic 区别

    OC object-c 为了让java的开发者习惯 使用.的操作,所以可以将接口类中的变量 使用@property来声明属性.但是在.h中声明的属性,必须在.m中使用@synthesize或者@dyn ...

  4. @synthesize和@dynamic分别有什么作用?

    @property有两个对应的词,一个是 @synthesize,一个是 @dynamic.如果 @synthesize和 @dynamic都没写,那么默认的就是@syntheszie var = _ ...

  5. ibatis dynamic的用法

    <select id="idididid" resultClass="java.uitl.HashMap" parameterClass="ja ...

  6. OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法

    一. 分类-Category 1. 基本用途:Category  分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...

  7. 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)

    五.OC基础--1.多态, 1. 多态概念,定义:多态就是某一类事物的多种形态: 表现形式: Animal *ani = [Dog new]; 多态条件:1.有继承关系 2.有方法的重写 2.多态代码 ...

  8. OC语言@property @synthesize和id

    OC语言@property @synthesize和id 一.@property @synthesize关键字 注意:这两个关键字是编译器特性,让xcode可以自动生成getter和setter的声明 ...

  9. 李洪强iOS开发之OC语言@property @synthesize和id

    OC语言@property @synthesize和id 一.@property @synthesize关键字 注意:这两个关键字是编译器特性,让xcode可以自动生成getter和setter的声明 ...

随机推荐

  1. EasyUI Editable Tree

    效果如图: Create Tree <ul id="tt"></ul> $('#tt').etree({ url: 'tree_data.json', cr ...

  2. 在MVC3中使用WebForm

    Mvc和WebForm一直是有争议的两个平台,园子里也有很多人写过这方面的文章,给我印象比较深的是去年的时候看过的两篇文章http://www.cnblogs.com/mikelij/archive/ ...

  3. linux下安装NPM管理工具

    根据”挖一下“开发需要,选择nodejs实现异步IO,目的是为了解决服务器卡死导致无法处理后续的http请求.看了花瓣的架构视频讲座,才决定这么做的,挺有道理的. 安装nodejs很顺利,下载源码包, ...

  4. javaScript 消除错误,并将错误记录在控制台,阻止浏览器错误警告

    当我们使用jquery,和其他各种框架时,有的时候会出现各种错误,  例如jquery文件报错,但又不影响功能,  又不能对jquery做出更改,怎么办呢? window.onerror=functi ...

  5. 下载编译Chrome详细步骤

    文章来源:http://blog.csdn.net/allendale/article/details/9262833 参考:http://dev.chromium.org/developers/ho ...

  6. 一个简单的string类,读书看报系列(一)

    对于这个类,写过程序的都知道应该含有的方法是 初始化.销毁.拼接.求长度.清除.判断是否为空等.还有一些操作符重载 一.先看初始化: 可以想到应该有默认构造的的.带有字符串的.带有默认字符的.还有一个 ...

  7. Android开发之简单的电子相册实现

    电子相册的效果图和结构图: 图片资源的文件: package com.example.electronicalbum; public interface ImageResource {   //用一个 ...

  8. Jmeter对基于websocket协议的压力测试

      WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex).   浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就 ...

  9. Docker集群实验环境布署--swarm【6 配置上层Nginx代理,让任意Docker client访问得到高可用的管理API】

    10.40.42.10上,也就是对应的VRRP中的10.40.42.1和2上,配置nginx tcp代理   # cat 4000_manager.venic.com_10.40.100.141-14 ...

  10. USACO 4.1 Beef McNuggets

    Beef McNuggetsHubert Chen Farmer Brown's cows are up in arms, having heard that McDonalds is conside ...