iOS 成员变量的作用范围

本文详细解析了Objective-C中成员变量的四种作用范围:public、private、protected及package,阐述了它们如何影响父类与子类之间的访问权限,并通过实例展示了不同修饰符的应用。
/*
  成员变量的作用范围:
  @public:在任何地方都能直接访问对象的成员变量
  @private:只能在当前类的对象方法中直接访问,如果子类要访问需要调用父类的get/set方法
  @protected:可以在当前类及其子类对象方法中直接访问(系统默认下是用它来修饰的)
  @package:在同一个包下就可以直接访问,比如说在同一个框架

注意:
    无论父类是在@interface还是@implementation声明的成员变量子类都能拥有;但是子类能不能直接通过变量名来访问父类中定义的成员变量是需要看父类中定义的成员变量是由什么修饰符来修饰的。
 
默认:在@implementation中成员变量的修饰符为@private,
     在@interface中成员变量的修饰符@protected

 */


#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    @public
    int _no;            // 学号
    
    @private
    int _age;           // 年龄
    
    @protected
    NSString *_name;    // 姓名
    
}

// 由@pirvate修饰的成员变量,子类对象只能通过get/set来访问
- (void)setAge:(int)age;
- (int)age;

@end



/********************************在mian方法中*******************************/

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[])
{
    
    Person *person = [Person new];
    // 在Person.h文件中no是@public修饰的可以直接访问
    person->_no = 10;
    NSLog(@"%d",person->_no); // 打印是10
    
    // Student类继承了父类Person类中的所有成员变量和方法,但是子类不能直接访问父类中由@private修饰的成员变量
    Student *stu = [Student new];
    [stu setAge:1000];
    NSLog(@"%d",[stu age]);
    
    return 0;
}

 

转载于:https://www.cnblogs.com/QM80/p/3575605.html

iOS开发中,getter和setter方法具有重要作用。 ### 封装数据 getter和setter方法可以对类的成员变量进行封装。例如在`Student`类中,通过`@property`声明`int age`属性,编译器会自动展开成getter和setter的声明,隐藏了成员变量的直接访问,提高了数据的安全性。开发者可以在setter方法中添加逻辑来控制对成员变量的赋值,确保数据的有效性和一致性。比如可以在设置年龄时检查输入的年龄是否在合理范围内。 ```objc // Student.h #import <Foundation/Foundation.h> @interface Student : NSObject { int age; } @property int age; @end // Student.m #import "Student.h" @implementation Student - (void)setAge:(int)newAge { if (newAge >= 0 && newAge <= 120) { age = newAge; } else { NSLog(@"Invalid age value"); } } - (int)age { return age; } @end ``` ### 实现计算属性 可以通过自定义getter和setter方法来实现计算属性。计算属性并不直接存储值,而是通过计算得到结果。例如可以根据已有的属性计算出一个新的值。 ```objc @interface Rectangle : NSObject @property (nonatomic) float width; @property (nonatomic) float height; @property (nonatomic, readonly) float area; @end @implementation Rectangle - (float)area { return self.width * self.height; } @end ``` ### 方法名自定义 开发者可以自定义getter和setter方法的名字。例如`@property(getter=show1,setter=show2:) int age;`,这样可以使方法名更符合特定的业务需求和代码风格,提高代码的可读性和可维护性 [^2]。 ### 自动生成存取方法 使用`@property`语法,编译器会自动生成一套存取方法。如在`Person`类中定义了`NSString *firstName`和`NSString *lastName`属性,编译器会自动生成相应的getter和setter方法,减少了开发者手动编写这些方法的工作量 [^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值