@property和@synthesize

来源:互联网 发布:夏普比率算法 编辑:程序博客网 时间:2024/06/15 13:31

现在好多刚入门的开发者对于这个@property和@synthesize这两个关键字弄不清楚,看公司里面的代码,好多老程序员留下的代码里面都有这个关键字,这个是衡量一个程序员是不是老程序员的关键,但不是衡量一个优秀的程序员的关键,为了咱们成为更优秀的程序员,为了更好的阅读代码,现在咱们就彻底弄清楚这写关键字是啥意思。


@interface Person : NSObject

{

    

    @public//这个代表这个成员变量是公共的,可以在外界访问,比如在main.m中访问用对象p->_age访问

    @protected//这个是默认的,受保护的,成员变量只能在自己内部或者在子类内部访问

    @private//这个是私有的,成员变量只能在自己的内部访问

    @package//只能在本框架内使用,不常用,不多做介绍

    NSInteger _age;

}

@property NSInteger age;

-(void)test;

@end


比如一个Person.h里面@propertyNSInteger age;这一句就是代表在声明了setter和getter方法

在早期的Xcode里面不会自动帮你写setter和getter方法,所以在Person.m里面@synthesize age = _age;这一句就是代表了实现了_age这个成员变量的setter和getter方法,这样在person类里面会自动创建_age这个成员变量,但是这个成员变量是私有的,只能在自己类的内部访问,其子类在内部也不能访问,或则通过setter和getter方法访问,如果想让其在子类内部访问,就在person.h里面声明一下成员变量,就像这样

@interface Person : NSObject

{

    NSInteger _age;

}

@property NSInteger age;

-(void)test;

@end

这样就能在子类内部访问这个成员变量了,

如果想让其在外部不通过setter和getter方法访问了,直接用对象访问,那就加上关键字

@interface Person : NSObject

{

    @public

    NSInteger _age;

}

@property NSInteger age;

-(void)test;

@end

这样就可以在外部直接用p->访问成员变量了

如果你偷懒只在person.m里面写了@synthesize age;
这样就代表了它会给你的成员变量age用setter方法赋值而不是_age,所以大家要注意这一点

不过这只是Xcode的4.2之前的功能,现在Xcode会自动为你做好setter和getter方法,只要一句
@property NSInteger age;
这样Xcode就自动为你生成一个_age的成员变量,你就可以用setter和getter方法访问了,如果想在其子类访问_age,那么你就在person.h里面声明一下这个实力变量,为了规范期间就用_开头的,比如

@interface Person : NSObject

{

    NSInteger _age;

}

这样就能在其子类里面访问_age了。