文章目录
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