编译器指令:

用来告诉编译器要做什么

  @property:

    @property是编译器的指令 告诉编译器在@interface中自动生成setter和getter的声明

  @synthesize:

    @synthesize是编译器的指令 告诉编译器在@implementation中自动生成setter和getter的实现

  手动写setter-getter:

#import <Foundation/Foundation.h>
@interface Member : NSObject
{
@public
NSString * _name;
int _age;
NSString * _account;
NSString * _password;
}
- (void) setName: (NSString *) name;
- (NSString *) name;
- (void) setAge: (int) age;
- (int) age;
- (void) setAccount: (NSString *)account;
- (NSString *) account;
- (void) setPassword: (NSString *) password;
- (NSString *) password;
@end #import "Member.h"
@implementation Member
- (void) setName: (NSString *) name{
_name = name;
}
- (NSString *) name{
return _name;
}
- (void) setAge: (int) age{
_age = age;
}
- (int) age{
return _age;
}
- (void) setAccount: (NSString *)account{
_account = account;
}
- (NSString *) account{
return _account;
}
- (void) setPassword: (NSString *) password{
_password = password;
}
- (NSString *) password{
return _password;
}
@end

  使用@property和@synthesize:

#import <Foundation/Foundation.h>
@interface Member : NSObject
{
@public
NSString * _name;
int _age;
NSString * _account;
NSString * _password;
}
@property NSString * name;
@property int age;
@property NSString * account;
@property NSString * password;
@end #import "Member.h"
@implementation Member
@synthesize name = _name;
@synthesize age = _age;
@synthesize account = _account;
@synthesize password = _password;
@end

  @property和@synthesize说明:

    @property:

      编译器只要看到@property, 就知道我们要生成某一个属性的getter/setter方法的声明

      /*
       - (void)setAge:(int)age;
       - (int)age;
       */
      // 使用@property等效以上两句
      @property int age;

      使用@property作声明的时候 , 不需要加下划线  _

      // 加上下划线后等效于以下两句
      @property int _age;
      /*
       - (void)set_age:(int)_age;
       - (int)_age;
       */

    @synthesize:

      在@synthesize后面告诉编译器, 需要实现哪个@property生成的声明

      /*
       - (void)setAge:(int)age
       {
       _age = age;
       }
       - (int)age
       {
       return _age;
       }
      */
      // 使用@synthesize等效以上部分
      // 如果成员变量_age不存在,就会自动生成一个私有的成员变量_age(在.m实现文件中)
      @synthesize age = _age;

      告诉@synthesize, 需要将传入的值赋值给谁和返回谁的值给调用者

      /*
       - (void)setAge:(int)age
       {
       _number = age;
       }
         - (int)age
       {
       return _number;
       }
       */
      // 如果这样写读写的是 _number 而不是 _age
      @synthesize age = _number;

       如果在@synthesize后面没有告诉系统将传入的值赋值给谁, 系统默认会赋值给和@synthesize后面写得名称相同的成员变量

      #import <Foundation/Foundation.h> 

      @interface Person : NSObject
      {
       @public
       int _age;
       int age;
      }
      @property int age;
      @end       #import "Person.h"
      @implementation Person
      @synthesize age;
      @end       #import <Foundation/Foundation.h>
      #import "Person.h"       int main(int argc, const char * argv[]) {
       Person *p = [Person new];
       [p setAge:];
       NSLog(@"_age = %i, age = %i", p->_age, p->age);
       return ;
      }
      /*
       输出结果:2015-09-01 19:13:45.846 synthesize基本使用[813:21032] _age = 0, age = 88
       所以 @synthesize age; 读写的是 age 属性而不是 _age
       如果成员变量 age 不存在,就会自动生成一个私有的成员变量 age(在.m实现文件中)
      */

      多个属性可以通过一行@synthesize搞定,多个属性之间用逗号连接

      @synthesize name = _name, age = _age, account = _account, password = _password;

私有成员:

  访问修饰符:

    @public

    >可以在其它类中访问被public修饰的成员变量

    >也可以在本类中访问被public修饰的成员变量

    >可以在子类中访问父类中被public修饰的成员变量

    @private

     >不可以在其它类中访问被private修饰的成员变量

    >可以在本类中访问被private修饰的成员变量

    >不可以在子类中访问父类中被private修饰的成员变量

     @protected

    >不可以在其它类中访问被protected修饰的成员变量

    >可以在本类中访问被protected修饰的成员变量

    >可以在子类中访问父类中被protected修饰的成员变量

     注意: 默认情况下所有的实例变量都是protected

    @package

    >介于public和private之间的

    如果是在其它包中访问那么就是private的

    如果是在当前代码所在的包种访问就是public的

  私有变量:

    写在@implementation中的成员变量, 默认就是私有的成员变量, 并且和利用@private修饰的不太一样, 在@implementation中定义的成员变量在其它类中无法查看, 也无法访问, 这种私有变量只能在本类中访问

    在@interface中定义的变量,  无论使用什么成员变量修饰符修饰(包括@private), 我们都可以在其它类中看到这个变量 只不过有得修饰符修饰的变量我们不能操作而已

  私有方法:

    如果只有方法的实现, 没有方法的声明, 那么该方法就是私有方法  不过在OC中没有真正的私有方法, 因为OC是消息机制

        // 访问只有实现没有声明的私有方法
id pp = [Person new];
[pp test]; Person *p = [Person new];
[p performSelector:@selector(test)];

@property增强

  1  从Xcode4.4以后apple对@property进行了一个增强, 以后只要利用一个@property就可以同时生成setter/getter方法的声明和实现

  2  默认@property会将传入的属性赋值给_开头的成员变量

  3  如果利用@property来生成getter/setter方法, 那么我们可以不写成员变量, 系统会自动给我们生成一个_开头的成员变量

   注意: @property自动帮我们生成的成员变量是一个私有的成员变量, 也就是说是在.m文件中生成的, 而不是在.h文件中生成的

  4  @property有一个弊端: 它只会生成最简单的getter/setter方法的声明和实现, 并不会对传入的数据进行过滤, 如果想对传入的数据进行过滤, 那么我们就必须重写getter/setter方法

如果重写了setter方法, 那么property就只会生成getter方法

如果重写了getter方法, 那么property就只会生成setter方法

如果同时重写了getter/setter方法, 那么property就不会自动帮我们生成私有的成员变量

#import <Foundation/Foundation.h>
@interface Member : NSObject @property NSString * name;
@property int age;
@property NSString * account;
@property NSString * password; @end #import "Member.h"
@implementation Member
@end

OC基础--Property的更多相关文章

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

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

  2. OC基础笔记目录

    OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...

  3. OC基础 代理和协议

    OC基础 代理和协议 1.协议 (1)oc语言中得协议:一组方法列表,不需要我们自己实现,由遵守协议的类来实现协议所定制的方法. (2)协议的使用步骤:制定协议-->遵守协议-->实现协议 ...

  4. OC基础 类的三大特性

    OC基础  类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...

  5. OC基础 点语法的使用

    OC基础 点语法的使用 1.创建一个Student类继承于NSObject,Student.h文件 #import <Foundation/Foundation.h> @interface ...

  6. OC基础16:复制对象

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.浅复制即是指针赋值,复制对象的修改会影 ...

  7. OC基础15:内存管理和自动引用计数

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...

  8. OC基础7:变量和数据类型

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.有时候初始化需要让对象带有初始值,那么 ...

  9. OC基础5:继承

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.根类即是最顶层的类,父类也可称为超类: ...

随机推荐

  1. gradle相关配置内容解析

    gradle 项目的构建工具,基于groovy语言.主要用于管理依赖包. as中一般将gradle下载在C:\Documents and Settings<用户名>.gradle\wrap ...

  2. HackPwn2015:IoT智能硬件安全威胁分析

    HackPwn2015:IoT智能硬件安全威胁分析 360安全卫士 · 2015/08/26 14:43 IoT(物联网)是一种既危险又有趣的混合技术,所谓的混合技术包括移动应用程序.蓝牙.Wi-Fi ...

  3. understanding ECMAscript 6 ---- block bindings

    Traditionally, the way variable declarations work has been one tricky part of programming in javascr ...

  4. EasyUI的combobox控件使用onchange 问题

    在项目中几次都遇到了同样的问题,现在都不知道怎样解决了! 路过的朋友们帮我看看嘛!谢谢了! 最后我想要实现的效果是这样的.   在下拉列表中不存在值.(这里的是下拉列表中存在值的!)  但是在我输入值 ...

  5. SSH网上答题系统质量属性

    我要做的事网上答题系统,通过注册登录到答题页面. 这其中数据库的连接靠Hibernate,数据库的增删改查用Sruts2实现. 关于Struts2的学习,仅仅在action的表面上,可以在action ...

  6. Javascript中apply、call、bind

    网上文章虽多,大多复制粘贴,且晦涩难懂,我希望能够通过这篇文章,能够清晰的提升对apply.call.bind的认识,并且列出一些它们的妙用加深记忆. apply.call 在 javascript ...

  7. diskpart查看硬盘序列号

    WIN + R键运行cmd,进如DOS界面: 1. systeminfo查看OS初始安装时间 2. diskpart工具查看硬盘序列号 (1)diskpart (2)lisk disk 查看主机安装的 ...

  8. 限制textarea输入内容长度(多浏览器兼容、鼠标操作可控)

    限制textarea的输入内容长度,当从键盘输入,内容长度达到最大值时,只有输入Backspace.Delete.左移动.右移动有效,当用鼠标粘贴内容,则只保留最大值长度的内容.从而控制textare ...

  9. Visual Studio Code中文文档(一)-快速入门

    Visual Studio Code是一个轻量级但是十分强大的源代码编辑器,重要的是它在Windows, OS X 和Linux操作系统的桌面上均可运行.Visual Studio Code内置了对J ...

  10. 数据库 'MessageManage' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列。

    提供两种办法:(SQL Server2008) 注意:建议使用第一种方法.第二种方法只是删除已有日志文件,日后还会继续生成. 第一种方法:清空日志. 1.打开企业管理器,直接在查询分析器里执行:(如果 ...