property自动为属性生成setter和getter方法。以及能够直接设置是否生成getter和setter方法。也能够自定义setter和getter的方法名。
//
// Person.h
// property
//
// Created by hhg on 15-6-8.
// Copyright (c) 2015年 hhg. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
/// 姓名
@property NSString *name;
/// 年龄
@property NSUInteger age;
/// id号码
@property NSUInteger idNumber;
/// 是否成年
@property BOOL adult;
一般都会指定一些权限,比如重写setter和getter名,指定非保护线程,只读等等
//
// Person.h
// property
//
// Created by hhg on 15-6-8.
// Copyright (c) 2015年 hhg. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
/// 姓名
@property (nonatomic, copy, getter=myName, setter=setMyName:) NSString *name;
/// 年龄
@property (nonatomic, assign, readonly) NSUInteger age;
/// id号码
@property (nonatomic, assign, readwrite) NSUInteger idNumber;
/// 是否成年
@property (nonatomic, assign, getter=isAdult) BOOL adult;
// OC里面的方法名: 去掉返回值,去掉参数类型,去掉参数名,剩下的就是方法名
- (void)setAge:(NSUInteger)age;
- (void)setName:(NSString *)name andAge:(NSInteger)age andIdNumber:(NSInteger)idNumber;
// 方法名 = setName: andAge: andIdNumber:
@end
//
// Person.m
// property
//
// Created by hhg on 15-6-8.
// Copyright (c) 2015年 hhg. All rights reserved.
//
#import "Person.h"
@implementation Person
- (void)setAge:(NSUInteger)age {
_age = age;
}
- (void)setName:(NSString *)name andAge:(NSInteger)age andIdNumber:(NSInteger)idNumber {
_name = name;
_age = age;
_idNumber = idNumber;
}
@end
调用的时候按照自定义的方法直接调用即可。
//
// main.m
// property
//
// Created by hhg on 15-6-8.
// Copyright (c) 2015年 hhg. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc] init];
p.idNumber = 74;
NSLog(@"%li", p.idNumber );
p.age = 123;
NSLog(@"%li", p.age);
p.myName = @"张三";
NSLog(@"%@", p.myName);
p.adult = YES;
NSLog(@"%d",p.isAdult);
}
return 0;
}
值得说一下的是,当setter方法名在property里面被改变了之后,原来的setter方法名仍旧有效。如下:
//
// main.m
// property
//
// Created by hhg on 15-6-8.
// Copyright (c) 2015年 hhg. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc] init];
p.myName = @"张三";
p.name = @"李四";
NSLog(@"%@", p.myName); // 打印的结果是 李四
}
return 0;
}
tip:用property声明成员变量是@private。 但是在子类中能够调用父类property。原因是property生成了setter和getter方法。子类通过setter和getter的方法就可以调用到。