Objective - C setter,getter与实例变量的关系, 属性, 点语法

什么时setter,getter,

  • 在OC里, 为实例变量赋zhi的方法称作setter(设置器)
  • 读取实例变量值的方法称作getter(访问器)
  • 我们之前写的那些赋值取值的方法都可以称作setter和getter

setter、getter的书写格式

  • OC里规定里setter和getter的书写格式
  • 如果一个实例变量是 int age; 或者int_age;
  • setter的书写格式如下 - (void)setAge:(int)age;即set+首字母大写的实例变量名(忽略下划线)
  • getter的书写格式如下, -(int)age; 即返回值类型与变量类型一致,方法名与实例变量名相同(忽略下划线)

setter、getter与实例变量的关系

  • 无论setter还是getter内部操作的是实例变量
  • 每一个实例变量都需要一对setter和getter方法

属性的定义

  • 属性都声明:使用@property声明属性(例如:@property NSString*name;)
  • 相当于@interface中声明里两个方法
  • - (void)setName:(NSString *)name;
  • -(NSString *)name;

属性的实现

  • 属性的实现:使用@synthesize实现属性(例如 :@synthesize name = _name)
  • 相当于@implementtation实现里
  • - (void)setName:(NSString *)name;
  • - (NSString *)name;

属性的属性

  • 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加锁解锁以保证线程访问安全,会很占用系统资源,降低系统性能。
  • 同城设置为nonatomic, 某些属性需要线程安全对时候,才定义为atomic

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

等价于;- (NSString *)name;

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

第三类

  • 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];

}

属性需要注意的是

  • 如果属性是非对象类型(比如int,float等)属性等语义设置只用assign
  • 如果属性是对象类型(比如NSString,NSArray等)属性等语义设置使用retain
  • 如果属性是对象类型,并且想得到参数的copy,使用copy关键字

-点语法的使用

  • 凡事符合系统默认setter、getter书写格式的方法,都可以使用点语法

例如:[person setName:@“zhangsan”];

可以等价写成 person.name = @“zhangsan”;

NSString *name = [person name];

可以等价写成NSString *name = person.name;

  • 属性是一对getter、setterfangfa,点语法是属性的另一种调用格式
时间: 2024-08-08 13:57:59

Objective - C setter,getter与实例变量的关系, 属性, 点语法的相关文章

第二讲、实例变量可见度、方法

一.实例变量可见度 可见度         特点 public          实例变量可以在类的外部和内部操作 protected    实例变量只能在该类和其子类内操作     默认 private        实例变量只能在该类内访问 内部:相应类的@implementation和@end之间 @interface Person : NSObject { @public NSString*_name; @protected NSString*_gender; int_age; //年龄

objective-C学习笔记(三)数据成员:属性与实例变量

类型成员 Type Member 结构体 struct 的成员很简单,只有变量. 类的成员就很多了: 数据成员 data member 描述对象(本讲重点) · 实例变量  instance variable · 属性 property 函数成员 function member · 方法 method · 初始化器  init · 析构器  dealloc 类的属性: 默认情况下,编译器会为属性定义propertyName自动合成: 一个getter访问器方法: propertyName 一个s

iOS基础-属性与实例变量区别

在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: @interface MyViewController :UIViewController { UIButton *myButton; } @property (nonatomic, retain) UIButton *myButton; @end 最近,苹果将默认编译器从GCC转换为LLVM(low level virtual machine),从此不再

Objective-C学习笔记_实例变量可?度及方法

? 实例变量可?度 可见度 特点 public(公有的) 实例变量可以在类的外部和内部操作 protected(受保护的,默认的) 实例变量只能在本类和其?类内部操作 private(私有的) 实例对象只能在本类内访问 所谓的内部,指的是相应类的@implementation和@end之间. 示例代码如下: #import <Foundation/Foundation.h> @interface Person : NSObject { @public NSString *_hobby; /**

【OC学习-9】利用@property属性和@synthesize简化实例变量的存取器方法

如果我们在一个类中定义了3个实例变量,那么如果要写存取器方法的话,需要写6个(每个实例变量各一个setter和getter).现在的简化方法是: (1)在类的.h文件里,只要写了属性,那么这个实例变量就可以被操作,如果想要不被操作保证安全,那么就不要声明属性,只要写在实例变量里即可. #import <Foundation/Foundation.h> //我们一般会省略实例变量的写法,因为写了属性后,一般会自动生成同名的实例变量 @interface ASStudent : NSObject{

在对象内部尽量直接访问实例变量 --Effictive Objective-C 抄书

在对象之外访问实例变量时,应该总是通过属性来做.在那么在对象内部访问实例变量的时候,又该如何呢? 这是 OCer们一直激烈讨论的问题.有人认为,无论什么情况,都应该通过属性来访问实例变量;也有人说,"通过属性访问"和"直接访问"应该搭配着用. 除了几种特殊情况之外, 笔者强烈建议大家在读取实例变量的时候采用直接访问的形式,而在设置实例变量的时候通过属性来做. 请看下面的类: @interface EOCPerson : NSObject @property(nona

KVC-键值编码是一种间接地访问实例变量的方式

KVC 键值编码是一种间接的访问实例变量的方式[对象 setValue:@"A" forKey:@"name"]; 工作原理:    1.先查找该类有没有对应的setName: setter方法.如果有则调用setter方法给实例变量赋值,如果没有,转到第二步:    2.在查找带下划线的实例变量_name.如果有则给_name赋值,如果没有则转到第三步    3.最后查找和key值相同的实例变量name,如果有,则给name赋值,如果没有,转到第四步    4.调

OC实例变量初始化方法

OC实例变量初始化方法1. 使用实例setter方法 默认初始化方法 + setName:xxx setAge:xxx2. 使用实例功能类方法,默认初始化方法 + setName:xxx age:xxx3.使用实例初始化方法 initWith开头的方法4.使用构造器 类名+With…以Person  Student两个类为例1. 使用实例 setter方法这是最麻烦的方法 @interface Person : NSObject { NSString *_name; NSString *_sex

JNI/NDK开发指南(七)——C/C++访问Java实例变量和静态变量

转载请注明出处:http://blog.csdn.net/xyang81/article/details/42836783 在上一章中我们学习到了如何在本地代码中访问任意Java类中的静态方法和实例方法,本章我们也通过一个示例来学习Java中的实例变量和静态变量,在本地代码中如何来访问和修改.静态变量也称为类变量(属性),在所有实例对象中共享同一份数据,可以直接通过[类名.变量名]来访问.实例变量也称为成员变量(属性),每个实例都拥有一份实例变量数据的拷贝,它们之间修改后的数据互不影响.下面看一