OC基础--Property

编译器指令:

用来告诉编译器要做什么

  @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:88];
          NSLog(@"_age = %i, age = %i", p->_age, p->age);
          return 0;
      }
      /*
       输出结果: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
时间: 2025-01-01 01:09:52

OC基础--Property的相关文章

OC基础之-Property(属性)和点语法

学习属性之前回忆一下之前学到的setter方法和getter方法: (1)setter方法的作用:用来为单一的实例变量赋值(只能是一个实例变量,多了的叫做get方法) (2)setter方法的写法标准: - 号方法,  无返回值,   名字以set开头+要设置的变量的实例变量名(首字母需大写):(setter方法有且只有一个参数)+参数的类型(和实例变量的类型相同)+参数名(和实例变量名相同) (3)getter方法的作用:用来获取单一实例变量的值. (4)getter方法的写法标准: - 号方

黑马程序员--oc基础第六篇

六. oc基础知识(内存管理下) 总结:内存管理代码规范 1.只要调用alloc那么就必须调用release: 2.set方法的代码部分 *基本数据类型直接赋值. *如果是oc对象类型 - (void) setCar:(Car *)car { if(_car!=car) { [_car release]; _car=[Car retain]; } } 3.dealloc 部分的代码规范 *一定要[super dealloc ]放在最后面. *对self(当前)所拥有的其他对象做一次release

iOS开发OC基础:OC属性的一些概念和基本使用

一.属性简介 //属性是OC2.0之后新出的一种语法,能让我们快速的生成setter以及getter方法,大大简化代码 二.如何定义一个属性 //@property 属性关键字,用来定义属性 //NSString * 属性的类型 //name 属性的名字. //@property 只是生成的setter以及getter方法的声明.@property NSString *name; 三.属性的使用注意事项//如果在.m文件中我们自己实现了setter以及getter方法,则编译器就不会再帮我们生成

iOS开发OC基础:延展Extension

//延展Extension,是为类扩充私有的方法,以及私有的实例变量,和分类Category相比,延展定义的方法是私有的,而且还可以定义实例变量(私有的). //@interface 开头 + 类名(哪一个类的延展) + 小括号,小括号内填写的是延展名,一般情况下都省略. @end结束 (写在.m文件里) main函数中的完整代码为: #import <Foundation/Foundation.h> #import "Person.h" int main(int argc

OC基础 代理和协议

OC基础 代理和协议 1.协议 (1)oc语言中得协议:一组方法列表,不需要我们自己实现,由遵守协议的类来实现协议所定制的方法. (2)协议的使用步骤:制定协议-->遵守协议-->实现协议-->调用协议. (3)协议声明的关键字: (a)@required,必须实现,不实现的话在.m文件内会报警告. (b)@optional,可选实现,不实现的话在.m文件内也不会报警告. (4)协议和继承的区别: (a)相同之处:都可以规范统一类中的方法. (b)不同之处:继承的子类不需要再实现一遍父类

OC基础 点语法的使用

OC基础 点语法的使用 1.创建一个Student类继承于NSObject,Student.h文件 #import <Foundation/Foundation.h> @interface Student : NSObject { NSString *_name; NSString *_nickName; } //@property定义属性 //1,它给该类声明了一个属性名+下划线的变量 //2,它给该类声明了一个getter方法和一个setter方法 //修饰符 //atomic和nonat

OC基础(18)

Category基本概念 Category注意事项 *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: p

oc基础知识(转)

1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch框架 3.Xcode使用 -------------------- CocoaTouch Media Core Services Core OS -------------------- System Framework OC的类声明,定义域 OC关键字定义为  @class O-C特有的语句for(..in ..)迭代循环,其他的条件和循环语句和c一样 OC对面向对象的概述 (1)

OC基础 类的三大特性

OC基础  类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属性和方法不能被父类使用. (3)子类独有的属性和方法,不能够在子类之间互相使用. (4)子类能够重写父类的方法,子类调用该方法时:首先调用子类的方法,如果子类没有该方法,就调用父类的该方法. (5)子类对象指针可以转换成父类对象指针,但是父类对象指针不能够转换成子类对象指针. 三种权限变量的继承: