@property是编译器指令,告诉编译器给指定的成员变量生成get和set方法的【声明】 1)有类的成员变量_age 和_name,生成get和set方法的【声明】和【实现】 例如: - @interface Person : NSObject{
- int _age;
- NSString*_name;
- }
-
- @property int age; //生成_age的set和get方法
- @property NSString *name;
-
- -(void)test;
- @end
-
- @implementation Person
- //打印成员变量信息
- -(void)test{
- NSLog(@"_name = %@, _age = %d",_name,_age);
- }
- @end
- int main(int argc, const char * argv[])
- {
-
- @autoreleasepool {
-
- Person *p = [Person new];
- p.age = 23;
- p.name = @"Amos";
- NSLog(@"name = %@, age = %d",p.name,p.age);
- [p test];
- [p setAge:25];
- [p setName:@"Allen"];
- [p test];
- }
- return 0;
- }
复制代码
打印结果: 2015-10-05 09:16:09.204Day20[878:303] name = Amos, age = 23 2015-10-05 09:16:09.206Day20[878:303] _name = Amos, _age = 23 2015-10-05 09:16:09.206Day20[878:303] _name = Allen, _age = 25
分析结果: 由结果可知,在有_age和_name成员变量时使用@property可以同时生成他们的set、get方法的声明和实现 2)没有声明类的成员变量_age 和_name,此时@property会自动生成_age和_name,并且生成get和set方法的【声明】和【实现】 例如: 【注意】此时没有声明_age和_name - #import <Foundation/Foundation.h>
-
- @interface Person : NSObject
- @property int age; //生成_age的set和get方法
- @property NSString *name;
-
- -(void)test;
- @end
-
- @implementation Person
- //打印成员变量信息
- -(void)test{
- NSLog(@"_name = %@, _age = %d",_name,_age);
- }
- @end
- int main(int argc, const char * argv[])
- {
-
- @autoreleasepool {
-
- Person *p = [Person new];
- p.age = 23;
- p.name = @"Amos";
- NSLog(@"name = %@, age = %d",p.name,p.age);
- [p test];
- [p setAge:25];
- [p setName:@"Allen"];
- [p test];
- }
- return 0;
- }
复制代码
打印结果:
2015-10-05 09:18:54.410 Day20[896:303] name = Amos,age = 23 2015-10-05 09:18:54.412 Day20[896:303] _name = Amos,_age = 23 2015-10-05 09:18:54.412 Day20[896:303] _name = Allen,_age = 25 【分析结果】 跟有声明_name和_age时是一样的,是不是很神奇很方便?
@property增强使用 在Xcode4.4以后。可以只使用@property而不使用@synthesize。同时声明和实现了_age和_name,操作的是带有下划线的实例变量,如果没有带下划线的实例变量,系统就会自动生成。但是自动生成的实例变量是私有的,对其他类和子类都是隐藏的,子类是看不到的(跟private的变量有所不同,private变量子类是可以看到,但是不能访问)。 例如: - #import <Foundation/Foundation.h>
-
- @interface Person : NSObject{
- int age;
- NSString *name;
- }
- @property int age; //生成_age的set和get方法
- @property NSString *name;
-
- -(void)test;
- @end
-
- @implementation Person
-
- //打印成员变量信息
- -(void)test{
- NSLog(@"_name = %@, _age = %d",_name,_age);
- NSLog(@"name = %@, age = %d",name,age);//此时再用age和name会报错
- }
- @end
- int main(int argc, const char * argv[])
- {
-
- @autoreleasepool {
-
- Person *p = [Person new];
- p.age = 23;
- p.name = @"Amos";
- [p test];
- }
- return 0;
- }
复制代码
打印结果: 2015-10-05 09:37:00.826 Day20[1025:303] _name = Amos,_age = 23 2015-10-05 09:37:00.828 Day20[1025:303] name = (null),age = 0 【分析结果】 由结果可知,系统自动生成了带下划线的变量,并使用的是带下划线的变量。
|