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;

}

posted on 2016-04-16 15:27  小|晄  阅读(134)  评论(0编辑  收藏  举报

导航