property,nonatomic,readwrite / readonly,strong/assign/retain/copy/weak 用法
#import <Foundation/Foundation.h>
@interface People : NSObject
{
@public
int height; //成员变量
}
//@property 属性参数分为:
//1.nonatomic / atomic
// nonatomic 代表了线程不安全的,不会对属性进行加锁操作,由于不加锁,在单线程的情况下效率高
// atomic 代表了线程安全,会对属性进行加锁操作,保证了属性不会因为多线程的情况,值被修改。
//2.readwrite / readonly
// readwrite 可写可读 会声明set和get方法
// readonly 可读 只会声明get方法
//3.strong/assign/retain/copy/weak
// strong 强引用,被该关键字修饰的属性只有被销毁时才会消失
// assign 对于gc类型只进行赋值,gc(就是基本数据类型,int,float..)
// retain 复制原有对象到一个新的对象,原有的对象引用次数加1 -- 浅拷贝 只复制对象的内存地址
// copy 销毁原有对象,创建一个新对象,将原有对象的内容复制到新对象当中 - 深拷贝 完全创建一个新的对象,将原来对象东西全部复制过来
// weak 弱引用 类似于assgin的操作,区别在于,weak会将在不使用这个属性的时候复制为nil.
//使用场景
// strong 和retain用于类 copy用于字符串 assgin/weak用于基本类型
// 对于数组来由用retain或者copy的意义是一样的。因为最后都会变成retain
//在最初的时候 property是负责声明set和get方法,不会去实现
//现在property一个关键字就分别声明和实现了set/get方法
//property属性会自动给属性加上 _ 以区分和成员属性的区别
//用self来set/get这个属性 -
//_age 和 self.age的区别在于 一个是对属性的直接访问,不会调用set/get方法,用法和非property修饰的成员变量一样;
//所以为了安全性,最好都是用self.age的模式,不管是在本类还是外部类 如果用_age的模式 会打破封装的特性,暴露属性的存在
//property 用意在于对属性的访问控制
@property (nonatomic,readwrite,assign)CGFloat height;
- (void)display;
- (void)showInfo;
@end
//
// People.m
// OC_MoreType
//
// Created by whunf on 16/3/31.
// Copyright © 2016年 whuf. All rights reserved.
//
#import "People.h"
@implementation People
//早期的时候synthesize负责实现set/get方法
@synthesize height = _height; //这里的等号不是赋值,是将两个属性作用相等
//为什么手写了set/get方法之后_height就不能使用了?
//1.在set/get方法的内部,是需要区别self.xx和height的区别所以需要用到_xx
//2.当重写set或者get其中之一的时候,系统会自动将_height补上,也就是可以识别出_xx
- (void)showInfo
{
_height = 20;
NSLog(@"%lf",_height);
}
- (void)display
{
// self.height = 1.2; //这里property属性自动生成并且调用了set方法
NSLog(@"%lf",self.height);//这里property属性自动生成并且调用了get方法
}
- (void)setHeight:(CGFloat)newHeight
{
NSLog(@"设置Height");
_height = newHeight;
}
- (CGFloat)height
{
NSLog(@"返回Height的值");
return _height;
}
@end
#import <Foundation/Foundation.h>
#import "People.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
People *peo = [[People alloc]init];
peo.height = 1.23;
// [peo setHeight:1.23];相当于
[peo display];
[peo showInfo];
}
return 0;
}