美文网首页
OC中属性

OC中属性

作者: Bc_wh1te_Le1 | 来源:发表于2016-07-05 18:16 被阅读53次

0x00 引用自禅与 Objective-C 编程艺术刘亚芳博客


0x01 属性的定义

属性都声明:使用@property声明属性

(例如:@property NSString*name;)

相当于@interface中声明里两个方法

- (void)setName:(NSString *)name;

-(NSString *)name;


0x02 属性的实现

属性的实现:使用@synthesize实现属性

(例如 :@synthesize name = _name)

相当于@implementtation实现里

- (void)setName:(NSString *)name;

- (NSString *)name;


0x03 属性的‘属性’

Objective-C提供属性的的是为了简化程序员编码

为属性提供了一些关键字用以控制setter、getter的实现细节

这些关键字我们称为属性的属性(attribute),一共3大类attribute。

1、读写性控制(readonly,readwrite,setter,getter)

如果读写性控制的关键字是readonly,是告诉编译器,只声明getter方法(无setter方法)

例如;@property(readonly)NSString *name;  

等价于  - (NSString *)name;

如果是readwrite ,告诉编译器,即声明setter有声明getter

例如:@property(readwrite)NSString *name;

等价于 - (NSString *)name;

- (void)setName:(NSString *)name;

* readwrite是读写性控制的默认设置

2、原子性控制(nonatomic、atomic)

如果原子性控制的关键字是atomic。setter、getter方法在多线程访问下是绝对安全的,即setter、getter内部做了多线程访问处理,原子性控制的默认设置是atomic;

如果原子性控制的关键字是nonatomic,setter、getter方法内部不会做多线程访问处理,仅仅是普通多setter、getter方法;

程序开发过程中,setter、getter处处都在用,如果使用atomic,需要不断的对setter、getter加锁解锁以保证线程访问安全,会很占用系统资源,降低系统性能。

3、语义设置(assign,retain,copy)

如果语义设置对关键字是assign,setter、getter内部实现是直接赋值,

例如:

@property(nonatomic , assign)NSString *name;

- (void)setName:(NSString *)name

   _name = name;

-(NSString *)name{

     return _name;

}

如果语义设置的关键字是retain,setter、getter的内部实现会做内存优化

例如:

@property(nonatomic,retain)NSString *name;

- (void)setName:(NSString *)name{

        if(_name != name){

           [_name release];

           _name = [name retain];

         }

}

- (NSString *)name{

return [[_name retain]autorelease];

如果语义设置的关键字是copy,setter、getter的内部实现也会做内存优化

例如 

@porperty(nonatomic , copy)NSString *name;

- (void)setName:(NSString*)name

{

    if(_name!= name) {

        [_name release];

         _name= [name retain];

}

}

- (NSString*)name

{

return[[_name retain]autorelease];

}

4、特别注意 

如果属性是非对象类型(比如int,float等)属性等语义设置只用assign

如果属性是对象类型(比如NSString,NSArray等)属性等语义设置使用retain

如果属性是对象类型,并且想得到参数的copy,使用copy关键字

0x04  属性之禅

推荐按照下面的格式来定义属性

@property (nonatomic, readwrite, copy) NSString *name;

属性的参数应该按照下面的顺序排列: 原子性、读写、内存管理。 这样做你的属性更容易修改正确,并且更好阅读。

你必须使用nonatomic,除非特别需要的情况。在iOS中,atomic带来的锁特别影响性能。

属性可以存储一个代码块。为了让它存活到定义的块的结束,必须使用copy(block 最早在栈里面创建,使用copy让 block 拷贝到堆里面去)

相关文章

  • OC中属性

    0x00 引用自禅与 Objective-C 编程艺术与刘亚芳博客 0x01 属性的定义 属性都声明:使用@pro...

  • OC的@property与Swift的存储属性/计算属性类比

    Swift中的计算属性/存储属性与OC中的@property   Swift中引入了存储属性、计算属性的概念,存储...

  • (十五) [Swift]Swift中的optional chai

    在oc中没有optional 的概念,一个对象可能有很多属性,每个属性都个能还有自己的属性。OC中可以连续调用没有...

  • AppleScript-record对象

    理解类似于OC中的字典,js中的对象 创建 获取属性the 属性名 of 对象 设置属性 获取属性数量

  • Swift 属性与下标

    swift中属性分为静态属性和存储属性,存储属性类似于OC中的数据成员,计算属性不存储数据 存储属性 存储属性适用...

  • 2018-04-01

    oc中对于类的属性声明和实现其getter和setter方法,oc 2.0中增加了属性声明,就是可以不用单独为每一...

  • 2018-04-01

    oc中对于类的属性声明和实现其getter和setter方法,oc 2.0中增加了属性声明,就是可以不用单独为每一...

  • 小谈@property的特质

    熟悉OC的小伙伴都会经常用到property(属性),属性是OC语言的一种特性,主要作用是封装对象中的数据,OC对...

  • 属性

    存储属性其实Swift中的存储属性就是以前学习OC中的普通属性, 在结构体或者类中定义的属性, 默认就是存储属性*...

  • 【Swift】runtime简单应用

    1、获取属性列表 2、模型中基本类型不能设置为可选类型,因为kvc是oc的,而oc中基本类型没有可选。 另外属性不...

网友评论

      本文标题:OC中属性

      本文链接:https://www.haomeiwen.com/subject/kpnhjttx.html