@property @synthesize @dynamic @synchronized

@property @synthesize @dynamic @synchronized

当你定义了一系列的变量时,需要写很多的getter和setter方法,而且它们的形式都是差不多的,,所以Xcode提供了@property和@synthesize属性,@property用在 .h 头文件中用作声明,@synthesize、@dynamic用在.m 文件中用于实现。

@property 在头文件中声明getter和setter方法
@synthesize 在实现文件中生成相应的getter和setter方法
@dynamic 告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成。(假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var =someVar,由于缺setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺getter方法同样会导致崩溃)

以上为旧版本的Xcode的一些特性。在最新的版本中这些关键字的功能有所不同。
1、如果在头文件中使用了@property关键字,则编译器除了声明变量的getter和setter方法之外,还会增加一个_var的成员变量,并且会在.m文件中实现相应的getter和setter方法(设值和取值方法)。
2、@synthesize这个属性可以不用

在使用oc进行开发时,经常需要对大量的成员变量生成设值方法和取值方法,如果全部手动实现,那么将浪费程序员大量的时间敲写这些重复性的垃圾代码。自从oc2.0开始,可以自动生成设值和取值方法。那就是使用@property属性和@synthesize关键字。关于这两个关键字使用中的细节在这里进行详细的解释。

1. 使用@property自动生成成员变量以及取值和设值方法

代码如下:

@interface Person:NSObject 
@property int age; 
@end 
@implementation Person 
@end

解释:例如这种在实现部分不使用@synthesize,直接使用@property属性进行声明,那么编译器会自动生成一个int _age;型的成员变量,而且会在实现部分自动生成如下的设值和取值方法。

- (void)setAge:(int)age 
    { _age = age; } 
- (int)age 
    { return _age; }

2. 手动实现设值方法,使用@property自动生成成员变量和取值方法

代码如下:

@interface Person:NSObject 
@property int age;
 - (void)setAge:(int)age; 
@end 
@implementation Person 
- (void)setAge:(int)age 
    { _age = age; } 
@end

解释:例如这种在实现部分不使用@synthesize,直接使用@property属性进行声明,并且实现部分手动生成了设值setAge:方法,那么编译器会自动生成一个int _age;型的成员变量,而且会在实现部分自动生成如下的取值方法。

- (int)age { return _age; }  

同理,在实现部分不使用@synthesize,直接使用@property属性进行声明,并且实现部分手动生成了取值age:方法,那么编译器会自动生成一个int _age;型的成员变量,而且会在实现部分自动生成setAge:的设值方法。

3. 手动实现设值和取值方法,使用@property不会自动生成成员变量

代码如下:

@interface Person:NSObject 
{ int _age; //此处必须手动实现 } 
@property int age; 
- (void)setAge:(int)age; 
- (int)age; 
@end
@implementation Person 
- (void)setAge:(int)age { _age = age; } 
- (int)age { return _age; } 
@end

解释:例如这种手动实现设值和取值方法,那么即使使用了@property属性,那么编译器也不会自动生成一个int _age型的成员变量,必须自己手动声明一个_age的成员变量。如果不手动声明,那么编译器就会报错,因为设值和取值方法找不到_age的成员变量。

4. @synthesize的使用

代码如下:

@interface Person:NSObject 
{     int _age; 
    int age; 
} 
@property int age; 
@end 
@implementation Person 
@synthesize age; 
@end

解释:
这种使用了@synthesize age;的情况,那么设置和取值方法会默认访问age成员变量,而不是_age成员变量,如果没有声明age的成员变量,那么设置和取值方法才会访问_age的成员变量。
如果想让设置和取值方法访问_age的成员变量,那么必须显示指明,即使用@synthesize age=_age,这样设置和取值方法就会访问_age的成员变量,而不是age的成员变量。
例如@synthesize age=_age这种显示指明访问哪个成员变量的方式,如果没有声明_age的成员变量而声明了age的成员变量,那么编译器也不会访问age成员变量,编译器而是会自动生成一个_age的成员变量去访问。

总结
@property和@synthesize提高了开发者的效率,不用重复的去敲写垃圾代码。
在使用了@property的情况,若手动实现了设值方法,编译会自动生成取值方法;若手动实现了取值方法,编译会自动生成设置值法(若只手动实现其中一个,编译器还会自动生成相应的成员变量);若手动实现了设值和取值方法,编译不会自动生成不存在的成员变量。
@synthesize age=variablename,age是属性, variablename才是我们要访问的成员变量。

@synchronized 锁

@synchronized,代表这个方法加锁, 相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程例如B正在用这个方法,有的话要等正在使用synchronized方法的线程B运行完这个方法后再运行此线程A,没有的话,直接运行。
代码如下:

//线程1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    @synchronized(obj){
        [obj method1];
        sleep(10);
    }
});

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

推荐阅读更多精彩内容