A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chunhuayun 中级黑马   /  2015-10-5 15:16  /  500 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

@property是编译器指令,告诉编译器给指定的成员变量生成get和set方法的【声明】
1)有类的成员变量_age 和_name,生成get和set方法的【声明】和【实现】
例如:
  1. @interface Person : NSObject{
  2.     int _age;
  3.     NSString*_name;
  4. }

  5. @property int age; //生成_age的set和get方法
  6. @property NSString *name;

  7. -(void)test;
  8. @end

  9. @implementation Person
  10. //打印成员变量信息
  11. -(void)test{
  12.      NSLog(@"_name = %@, _age = %d",_name,_age);
  13. }
  14. @end
  15. int main(int argc, const char * argv[])
  16. {

  17.     @autoreleasepool {
  18.         
  19.         Person *p = [Person new];
  20.         p.age = 23;
  21.         p.name = @"Amos";
  22.         NSLog(@"name = %@, age = %d",p.name,p.age);
  23.         [p test];
  24.         [p setAge:25];
  25.         [p setName:@"Allen"];
  26.         [p test];
  27.     }
  28.     return 0;
  29. }
复制代码


打印结果:
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
  1. #import <Foundation/Foundation.h>

  2. @interface Person : NSObject
  3. @property int age; //生成_age的set和get方法
  4. @property NSString *name;

  5. -(void)test;
  6. @end

  7. @implementation Person
  8. //打印成员变量信息
  9. -(void)test{
  10.      NSLog(@"_name = %@, _age = %d",_name,_age);
  11. }
  12. @end
  13. int main(int argc, const char * argv[])
  14. {

  15.     @autoreleasepool {
  16.         
  17.         Person *p = [Person new];
  18.         p.age = 23;
  19.         p.name = @"Amos";
  20.         NSLog(@"name = %@, age = %d",p.name,p.age);
  21.         [p test];
  22.         [p setAge:25];
  23.         [p setName:@"Allen"];
  24.         [p test];
  25.     }
  26.     return 0;
  27. }
复制代码


打印结果:

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变量子类是可以看到,但是不能访问)。
例如:
  1. #import <Foundation/Foundation.h>

  2. @interface Person : NSObject{
  3.     int age;
  4.     NSString *name;
  5. }
  6. @property int age; //生成_age的set和get方法
  7. @property NSString *name;

  8. -(void)test;
  9. @end

  10. @implementation Person

  11. //打印成员变量信息
  12. -(void)test{
  13.      NSLog(@"_name = %@, _age = %d",_name,_age);
  14.      NSLog(@"name = %@, age = %d",name,age);//此时再用age和name会报错
  15. }
  16. @end
  17. int main(int argc, const char * argv[])
  18. {

  19.     @autoreleasepool {
  20.         
  21.         Person *p = [Person new];
  22.         p.age = 23;
  23.         p.name = @"Amos";
  24.         [p test];
  25.     }
  26.     return 0;
  27. }
复制代码


打印结果:
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
【分析结果】
由结果可知,系统自动生成了带下划线的变量,并使用的是带下划线的变量。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马