Objective-C 使用 getter setter 读写非公开的成员属性

总目录 iOS开发笔记目录 从一无所知到入门

Intro

一般情况下,起封装作用的类中的成员属性是不会公开提供给外界直接读写的。
通过 非公开的成员属性+公开的读写方法 提供对这些值的读写。

测试代码

Screenshot

自定义一个类,在 @interface 中的成员属性默认为@protected 访问级别。
在这里插入图片描述

getter & setter 方法签名:
在这里插入图片描述

main:
在这里插入图片描述

Code

//
//  main.m
//  类和对象的基本使用2
//
//  Created by wuyujin1997 on 2023/2/25.
//
#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    
    
    // 默认的访问级别 @protected
    NSString* _name;
    int _age;
    Boolean _married;
}

//+ (Person*) person;   // 返回值可以使用 instancetype
+ (instancetype) person;
+ (instancetype) personWithName:(NSString*)name age:(int)age married:(Boolean)married;
- (void) show;
- (void) testSelfFeature;

// 提供 setter 方法设置属性值
- (NSString*) name;
- (int) age;
- (Boolean) married;
// 提供 getter 方法获取属性值
- (void) setName:(NSString*)name;
- (void) setAge:(int)age;
- (void) setMarried:(Boolean)married;

@end

@implementation Person

+ (instancetype) person {
    
    
    return [Person new];
}

+ (instancetype) personWithName:(NSString*)name age:(int)age married:(Boolean)married {
    
    
    Person* p = [Person new];
    p->_name = name;
    p->_age = age;
    p->_married = married;
    return p;
}

- (void) show {
    
    
    NSLog(@"Person  name:%@ age:%d married:%d", _name, _age, _married);
}

- (void) testSelfFeature {
    
    
    NSString* _name = @"方法内部的局部变量的值";
    NSLog(@"_name:%@", _name);
    NSLog(@"self._name:%@", self->_name);
//    NSLog(@"self._name:%@", self._name);    // Property '_name' not found on object of type 'Person *'; did you mean to access instance variable '_name'?
    NSLog(@"成员方法内部 self 指针的地址:%p", self);
}

- (NSString*) name {
    
    
    return _name;
}
- (int) age {
    
    
    return _age;
}
- (Boolean) married {
    
    
    return _married;
}
- (void) setName:(NSString*)name {
    
    
    // self._name = name;   // 会报错
    // Property '_name' not found on object of type 'Person *'; did you mean to access instance variable '_name'?
//    _name = name;   // 直接使用成员变量名来访问。
    self->_name = name;
}
- (void) setAge:(int)age {
    
    
//    _age = age;
    self->_age = age;
}
- (void) setMarried:(Boolean)married {
    
    
//    _married = married;
    self->_married = married;
}
@end

int main(int argc, const char * argv[]) {
    
    
//    Person* p1 = [Person personWithName:@"wuyujin" age:26 married:false];
//    [p1 show];
    
    Person* p2 = [Person new];
    [p2 show];
    // 使用 getter 获取成员属性的值
    NSLog(@"name:%@  age:%d  married:%d", [p2 name], [p2 age], [p2 married]);
    // 使用 setter 修改成员属性的值
//    p2->_name = @"test";  // Instance variable '_name' is protected
    [p2 setName:@"wuyujin"];
    [p2 setAge:26];
    [p2 setMarried:false];
    NSLog(@"name:%@  age:%d  married:%d", [p2 name], [p2 age], [p2 married]);
    [p2 show];
    
    
    [p2 testSelfFeature];
    NSLog(@"对象的地址: %p", p2);
//    NSLog(@"对象 class 的地址: %p", [p2 class]);
    
    return 0;
}

输出

2023-02-27 21:42:47.106458+0800 类和对象的基本使用2[36942:1110981] Person  name:(null) age:0 married:0
2023-02-27 21:42:47.106745+0800 类和对象的基本使用2[36942:1110981] name:(null)  age:0  married:0
2023-02-27 21:42:47.106781+0800 类和对象的基本使用2[36942:1110981] name:wuyujin  age:26  married:0
2023-02-27 21:42:47.106801+0800 类和对象的基本使用2[36942:1110981] Person  name:wuyujin age:26 married:0
2023-02-27 21:42:47.106828+0800 类和对象的基本使用2[36942:1110981] _name:方法内部的局部变量的值
2023-02-27 21:42:47.106848+0800 类和对象的基本使用2[36942:1110981] self._name:wuyujin
2023-02-27 21:42:47.106880+0800 类和对象的基本使用2[36942:1110981] 成员方法内部 self 指针的地址:0x600000205580
2023-02-27 21:42:47.106900+0800 类和对象的基本使用2[36942:1110981] 对象的地址: 0x600000205580
Program ended with exit code: 0

猜你喜欢

转载自blog.csdn.net/wuyujin1997/article/details/129250762