美文网首页
理解属性概念

理解属性概念

作者: 氮化镓加砷 | 来源:发表于2016-09-06 13:37 被阅读38次

在很久很久以前iOS是木有@property滴,我们必须自己定义实例变量和存取方法

@interface User : NSObject
{
    NSString *name ;
    NSInteger age;
}

@end


#import "User.h"

@interface User()

@end

@implementation User

-(void)setName:(NSString *)_name{
    self->name = [_name copy];
}
-(NSString *)getName{
    return self->name;
}

@end

属性@property给我们带来了什么?

@property = ivar + getter + setter; PS : 实例变量 = 成员变量 = ivar

@property 会根据(特质)的类型自定义合成不同的存取方法,这个过程由编译 器在编译期执行。
编译器还要自动向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字

属性可以拥有的特质分为四类:
原子性---nonatomic
读/写权限---readwrite(读写) readonly (只读)
内存管理语义---assign、strong、weak、unsafe_unretained、copy
方法名---getter=<name>、setter=<name>
@property (nonatomic, getter=isOn) BOOL on;

@synthesize

@synthesize 根据(特质)去添加存取方法 !
(如果没有指定@synthesize , 会为属性自动添加 @synthesize propertyName = _propertyName)
_propertyName就是实例变量的名称,propertyName是属性名称。
意味着使用属性可以通过存取方法去访问_propertyName实例变量。
直接访问实例变量不会调用属性的存取方法

@dynamic不会为属性自动创立合成方法,也不会自动添加属性。


#import <Foundation/Foundation.h>

@interface User : NSObject
@property (nonatomic,copy) NSString *subName;
@property (nonatomic,copy) NSString *name;
@end

#import "User.h"

@interface User()

@end

@implementation User

@synthesize subName = _subName;
@dynamic name  ;

-(void)setName:(NSString *)name{
      self.subName = [_subName stringByAppendingString:name];
}


@end


@dynamic 就是要告诉编译器,代码中用@dynamic修饰的属性,其getter和setter方法会在程序运行的时候或者用其他方式动态绑定,以便让编译器通过编译。其主要的作用就是用在NSManagerObject对象的属性声明上,由于此类对象的属性一般是从Core Data的属性中生成的,core data 框架会在程序运行的时候为此类属性生成getter和setter方法。

总结一下:

当你想手动管理 @property 的所有内容时,你就会尝试通过实现 @property 的所有“存取方法”(the accessor methods)或者使用 @dynamic 来达到这个目的,这时编译器就会认为你打算手动管理 @property,于是编译器就禁用了 autosynthesis(自动合成)。

因为有了 autosynthesis(自动合成),大部分开发者已经习惯不去手动定义ivar,而是依赖于 autosynthesis(自动合成),但是一旦你需要使用ivar,而 autosynthesis(自动合成)又失效了,如果不去手动定义ivar,那么你就得借助 @synthesize 来手动合成 ivar。

当你同时重写了 setter 和 getter 时,系统就不会生成 ivar(实例变量/成员变量)。这时候有两种选择:
手动创建 ivar 或者使用@synthesize ; 关联 @property 与 ivar。

PS : effective Objective-C建议我们在对象内部尽量直接访问实例变量而不是用存取方法。

相关文章

  • 理解属性概念

    在很久很久以前iOS是木有@property滴,我们必须自己定义实例变量和存取方法 属性@property给我们带...

  • 面向对象

    理解对象属性: 概念:无序的值和属性对应 理解并创建属性: 理解继承: 对象的定义,无序的属性集合,属性的值可以是...

  • 《编写高质量iOS与OS X代码的52个有效方法》6-9

    第6条:理解“属性”这一概念 需要理解的概念:对象、消息传递、Object-C运行期环境属性的相关概念:存取方法/...

  • 编写高质量ios代码2

    1.理解属性这一概念 首先我们应当理解属性这一概念,看如下代码: 在OC的类中我们当然可以这样声明属性,但是这样的...

  • 《Effective Objective-C 2.0 》 阅读笔

    第6条:理解“属性”这一概念 1. 属性的概念 “属性”(property)是Objective-C的一项特性,用...

  • iOS中property用法梳理

    为什么要用property属性,理解"属性"的概念. "属性"(property)是Objective-C的一项特...

  • iOS -- 理解 属性 的概念 (5)

    理解 属性 的概念 属性会自动生成存取方法, 可以利用点语法调用, 若不想编译器自动合成存取方法, 可以自己实现...

  • 理解“属性”这一概念

    @property:编译器自动编写访问这些属性的存取方法;(这个过程有编译器在编译期执行,所以编辑器里看不到这些“...

  • Linux中的进程之进程基本概念

    一、概念的理解 二、进程的属性 一、概念的理解 首先程序与进程是什么?程序与进程又有什么区别?程序(procedu...

  • 编写高质量iOS与OS X代码的52个有效方法(二)

    对象、消息、运行时 理解“属性”的概念 属性的基础用法就不多叙述了属性特质 属性拥有的特质分为4类 1、原子性 a...

网友评论

      本文标题:理解属性概念

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