编译器指令:

用来告诉编译器要做什么

  @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. Node聊天程序实例06:server.js

    作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. server ...

  2. js多个输入框运算计算结果输出到另一个输入框

      <div id="ckjrzy_4_14_15"> <div id="ckjrzy_4_14_17">收益计算器 </div& ...

  3. Could not resolve placeholder 解决方案

    spring 配置加载properties文件的时候,报 Could not resolve placeholder 错误. 经过仔细查找,排除文件路径,文件类容错误的原因,经过查找相关资料,出现&q ...

  4. Yii2使用教程

    安装 中文文档:http://www.yiichina.com/doc/guide/2.0/start-installation 1,安装 这里我直接下载归档文件,压缩包安装了.composer各种麻 ...

  5. TableView与delegate、dataResource

    小梦这几天学习tableView是深有体会了 废话不多说,来一波 首先,创建一个测试项目 如图 创建好,在项目结构中另外弄一个GroupFile,创建storyBoard和CocoaTouch 在st ...

  6. SPSS数据分析—配对Logistic回归模型

    Lofistic回归模型也可以用于配对资料,但是其分析方法和操作方法均与之前介绍的不同,具体表现 在以下几个方面1.每个配对组共有同一个回归参数,也就是说协变量在不同配对组中的作用相同2.常数项随着配 ...

  7. Java Integer(-128~127)值的==和equals比较产生的思考

    最近在项目中遇到一个问题,两个值相同的Integer型值进行==比较时,发现Integer其中的一些奥秘,顺便也复习一下==和equals的区别,先通过Damo代码解释如下: System.out.p ...

  8. 比较ID和Name

    早期的HTML使用name(名称)属性来标示每个元素,但考虑到名称会存在重复性,所以从HTML4版本开始W3C就不再使用name属性,而是使用ID作为元素的唯一标识符,但在某一反面依旧使用,如常用的: ...

  9. 基本类型和引用类型调用是的区别(Object.create)

    var person = { name : 'jim', address:{ province:'浙', city:'A' } } var newPerson = Object.create(pers ...

  10. Sass预一:

    为什么使用Sass 作为前端(html.javascript.css)的三大马车之一的css,一直以静态语言存在,HTML5火遍大江南北了.javascript由于NODE.JS而成为目前前后端统一开 ...