Objective-CiOS开发--OC基础知识首页投稿(暂停使用,暂停投稿)

OC知识--成员变量(属性,实例变量)的相关知识

2016-07-22  本文已影响724人  ITCharge

本文首发于我的个人博客:『不羁阁』 https://bujige.net
文章链接:https://bujige.net/blog/iOS-Member-variable.html

1. 成员变量介绍

1. 成员变量解释

我们把Objective-C中写在类声明的大括号中的变量称之为成员变量(也称为属性,实例变量)。

@interface Iphone : NSObject
{
    // 成员变量声明
    int _cpu;            // cup   0
    int _size;     // 尺寸  0
    int _color;          // 颜色  0

    // 其中_cpu、_size、_color 就是 Iphone  类的成员变量
}

2. 成员变量特点

2. setter和getter方法

我们无法从外界(比如其他类和文件中)直接访问定义在类中的成员变量。为了能够从外界操作成员变量,我们需要为调用者提供相应的方法来对成员变量进行访问、赋值等操作。而定义这些方法都需要有一个有意义的名字,所以就有了getter-setter方法。

getter-setter方法格式和写法是固定的,这也是程序员之间的一种规范,只要有人想要访问成员变量或给成员变量赋值,就会立刻想到getter-setter方法,这样就降低了程序员之间的沟通成本。

1. setter方法


如:如果成员变量为int _size 那么与之对应seter方法声明为

-(void) setSize: (int) size;


- (void)setSize:(int)size;
{
     //成员变量以下划线开头的好处,就是可以区分局部变量和成员变量    
    _size = size;
}

2. getter方法


如:如果成员变量为int _size 那么与之对应getter方法为

- (int) size;


- (int)size
{
    return _size;
}

3. getter/setter方法注意

3. 点语法

1. 点语法基本使用

如果给成员变量提供了getter和setter方法,就可以通过点语法来访问成员变量

2. 点语法的本质

3. 点语法注意


- (void) setAge:(int)age {

    // 下面的代码会引发死循环

    self.age = age;

    //编译器展开后 [self setAge:age]

}

- (int) age {

    // 下面的代码会引发死循环

    return self.age;

    // 编译器展开后 [self   age]

}

4. 实例变量修饰符

1. 实例变量的作用域

  1. @public
    • 公开的
    • 在有对象的前下,任何地方都可以直接访问
  2. @protected
    • 受保护的
    • 只能在当前类和子类的对象方法中访问
  3. @private
    • 私有的
    • 只能在当前类的对象方法中才能直接访问
  4. @package
    • 框架级别的
    • 作用域介于私有和公开之间,只要处于同一个框架中相当于@public,在框架外部相当于@private

@interface Iphone : NSObject
{
    @public
    int _cpu;
    
    @private
    int _size;
    
    @protected
    int _color;
    
     @package
    double _weight;
}
@end

2. 变量修饰符的继承和在子类中的访问

修饰符 类别 能否继承 在子类中的访问
@private 私有成员 能被继承 不能被外部方法访问
@public 共有成员 能被继承 不能被外部方法访问
@protected 保护成员 能被继承 不能被外部方法访问

3. 实例变量作用域使用注意事项

  1. 在@interface @end之间声明的成员变量如果不做特别的说明,那么其默认是protected的
  2. 一个类继承了另一个类,那么就拥有了父类的所有成员变量和方法,注意所有的成员变量它都拥有,只是有的它不能直接访问。例如@private的

5. @property相关

1. 什么是@property

2. @property基本使用


比如用@property int size;就可以代替下面的两行声明

- (int)size;   // getter

- (void)setSize:(int)size;  // setter

6. @synthesize相关

1. 什么是@synthesize

2. @synthesize基本使用


用@synthesize size; 就可以代替

- (int)size{

}

- (void)setSize:(int)size{

}

//注意:@synthesize size; 并没有告诉setter和getter 把size赋值给谁,返回谁

而用@synthesize size= _size;就可以代替

- (int)size{

    return _size;

}

- (void)setSize:(int)size{

    _size = size;

}

3. @synthesize注意点


@synthesize age = _age, number = _number, name  = _name;

7. @property拓展

1. @property增强

用@property int size;就可以替代下面两行声明
- (int)size;   // getter

- (void)setSize:(int)size;  // setter

以及下面两行实现
- (int)size{

    return _size;

}

- (void)setSize:(int)size{

    _size = size;

}


@property int size; 
// 帮我们生成了一个_size的成员变量,而该成员变量_size是私有成员变量

2. @property修饰符


@property (nonatomic, readonly) int size;
@property (nonatomic, readwrite) int color;


@property (nonatomic, getter=isMarried)  BOOL  married;
// 说明,通常BOOL类型的属性的getter方法要以is开头

上一篇 下一篇

猜你喜欢

热点阅读