#import <Foundation/Foundation.h>
@interface Person : NSObject
//属性也可以设置自己的属性,在@property后会有些可选属性
//1.原子属性
// nonatomic 非原子性,不保证多线程安全.
// atomic 原子性,多线程访问时安全.默认.
//2.setter语义属性
// assign 直接赋值 适用于基本数据类型.
// retain 赋值时做内存优化,适用于对象类型.
// copy 复制一个副本,适用于特殊的对象类型.
//3.读写属性
// readwrite 可读写(既有设置器也有访问器)默认.
// readonly 只读(只有访问器).
// getter = 方法名 指定访问器的方法名.
// setter = 方法名 指定设置器的方法名.
@property (nonatomic, getter=qvmingzi, setter=gaimingzi:)NSString *name;
@property (nonatomic, retain)NSString *sex;
@property (nonatomic, retain)NSString *hobby;
@property (nonatomic, assign)NSInteger age;
//实例(-)函数 . 初始化类成员. 我们将在便利构造器中用到这个函数.
- (instancetype)initWithName:(NSString *)name sex:(NSString *)sex hobby:(NSString *)hobby age:(NSInteger)age;
//类(+)函数. 便利构造器.
+ (instancetype)PersonWithName:(NSString *)name sex:(NSString *)sex hobby:(NSString *)hobby age:(NSInteger)age;
@end
#import "Person.h"
@implementation Person
// 自定义初始化方法实现
- (instancetype)initWithName:(NSString *)name sex:(NSString *)sex hobby:(NSString *)hobby age:(NSInteger)age
{
self = [super init];
if (self) {
[self gaimingzi:name]; //注意这里的方法名
[self setSex:sex]; //注意方法名 编译器自动生成 getter/setter方法
[self setHobby:hobby]; //这里也可以写成 self.hobby = hobby; //self点的 //hobby 代表设置器setter
[self setAge:age];
}
return self;
}
// 便利构造器实现
+ (instancetype)PersonWithName:(NSString *)name sex:(NSString *)sex hobby:(NSString *)hobby age:(NSInteger)age
{
Person *p = [[Person alloc] initWithName:name sex:sex hobby:hobby age:age];
return p;
}
//对象输出格式化方法 疑问. 直接输入"de", 编译器会提示完整函数
- (NSString *)description
{
return [NSString stringWithFormat:@"|name: %@| sex : %@| hobby : %@ |age: %ld|", [self name],[self sex],[self hobby], [self age]];
}
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
//利用便利构造器 手动初始化对象
Person *p = [Person PersonWithName:@"lilei" sex:@"male" hobby:@"sleep" age:24];
//利用属性更改对象的变量值
[p gaimingzi:@"Anni"];
//利用属性输出更改后的变量值
NSLog(@"%@", [p qvmingzi]);
//对象格式化输出 测试 这里也可以写成 NSLog(@"%@", [p description]); 效果是一样的
NSLog(@"%@", p );
return 0;
}