// 第八章(一) 属性
/*
属性: 是为实例变量提供了setter getter 方法的默认实现
一、属性的声明: @property
(1)相当于@interface中声明了两个方法(setter getter)
(2)可以不写变量定义;会自动定义下划线变量(私有变量)
声明属性(setter getter)的时候做了三件事情;
一、生成私有的实例变量, _属性名
二、声明了setter getter方法
三、实现 setter getter 方法的默认实现
@synthesize name = _name; //因此可以不写
二、属性的实现: @synthesize
相当于@implementation实现了setter getter
(1).h文件中无声明实例变量, 系统会自动添加一个私有的实例变量
@synthesize number;//实例变量的名字就是属性名 不带下划线
(2)@synthesize name = _hobby;用name属性(setter getter)去访问_hobby这个实例变量
(3)@synthesize name = _age; //error!!!
= 号左边是属性名 右端是实例变量的名字
*/
// 属性的属性(attribute):
// 第一类:读写性控制 控制提供setter 方法还是 getter 方法, 或者两者都提供
// readwrite(默认)读写, 同时提供 setter 和 getter:
@property (readwrite)NSString *name;
// readonly 只提供getter方法:
@property (readonly)NSString *name;
// setter getter 分别指定 getter setter 方法的名字:
@property (getter=sa,setter =wsad:)NSString *name;
// 第二类: 原子性控制
// atomic(默认)(原子性): 在多线程中, 一条线程访问某个资源时, 不允许别的线程访问同一块资源, 通过加线程锁来实现以及解线程锁来实现, 耗费系统资源.
@property (nonatomic, assign)NSInteger age;
// noatomic (非原子性)
// 第三类: 语义设置: 控制setter getter方法的内部实现细节
// assign(默认): 一般用在非对象类型
// 内部实现方法:
@synthesize age = _age;//如果要同时重写setter getter 方法, 需要写@synthesize
//重新系统的 setter方法
-(void)setAge:(NSInteger)age{
_age = age;
}
- (NSInteger)age{
return _age;
}
// retain: 对象类型
//retain 修饰的属性的setter getter 方法的内部实现
// 内部实现方法:
@synthesize kill = _kill;
- (void)setKill:(NSString *)kill{
if (_kill != kill) {
[_kill release];//修改BulidSetting 搜索arc OC自动参考计数
_kill = [kill retain];//内存优化
}
}
-(NSString *)kill{
return [[_kill retain]autorelease];
}
// copy: 对象类型; 先得到参数的拷贝, 再赋值给实例变量
// copy下的setter getter 方法的实现跟retain一样, 只是将实现中的retain改成了copy
//点语法: 提供一种便捷的属性访问方式
{
Student *stu = [[Student alloc]init];
[stu setName:@"黄红荫"];
NSLog(@"%@",[stu name]);
//调用的就是setter方法
stu.name = @"黄飞鸿";
//调用的就是getter方法
NSLog(@"%@",stu.name);
//只要满足setter getter方法的写法, 就可以使用点语法
stu.heihei = @"嘿嘿嘿";
NSLog(@"%@",stu.heihei);
}
OC - 第八章(一) 属性
最新推荐文章于 2023-09-21 21:18:31 发布