Objective-C 之 @property和@synthesize

IMU预积分--详细推导过程 IMU预积分推导 阅读详情

我用了不到一周的时间学习了Objective-C,后面的大部分时间我都在了解如何使用IOS的SDK和一些高级的话题,到目前已经有两个多月的时间了。目前能做一些简单的应用,但是在写代码的时候明显感觉到基础不够扎实,毕竟一周的时间只能对一门语言有个概览。要想精通一门语言是远远不够的。

   所以我把自己学习过程中遇到的一些问题整理在博客上,这也是一个学习理解的过程。

   今天要说的内容是Objective-C 中的 @property和@synthesize。在这之前先讲讲访问器(Accessor),也就是我们所知道的setter和getter方法。《Cocoa Design Patterns》中的将它归类为基础模式中的一种。访问器是很重要的技术,用来访问和设置对象的实例变量(不是指对象本身,而是对象中的属性)。有时候可能需要用不同的方式或者通过计算等方式来获取或设置实例变量,访问器给了我们很大的灵活性。在Cocoa中访问器有很多的优点: 

  • 实现灵活性。 可以在访问器中改变并实现不同的实例变量访问方式而不影响其他代码。
  • 可维护性。通过访问器对实例变量的更改易于维护。
  • 内存管理。访问器方法提供了简单的方法去遵守Cocoa的约定把内存管理代码隔离在少部分代码中。
  • 支持KVC和KVO。 KVC和KVO是很强大的技术。但是它们依赖于正确命名访问器。

     下面这段代码简单的实现了一个访问器(setter和getter): 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//setter
-( void )setStuName:(NSString *)stuName
   //_stuName 是实例变量
      if (_stuName != stuName)
      {
         [_stuName release];
          _stuName = [stuName copy];
      }
   }
//getter
   -(NSString *)stuName
   {
      return _stuName;
   }

    上面代码中的setter中还涉及到一定的内存管理,既然这个技术这么重要,那么有没有一种更方便的方法去做呢?答案就是@property和@synthesize。它们是Objective-C 2.0加入的指令,前者用于声明,后者用于合成访问器,结合使用就可以自动生成访问器了。 

    下面这段代码使用@property和@synthesize: 

?
1
2
3
4
5
6
7
8
9
@interface Student : NSObject
   
@property (nonatomic, copy) NSString *stuName;
@end
 
@implementation Student
 
@synthesize stuName = _stuName;
@end

   这段代码的效果跟上面代码的效果是一样的,是不是很方便呢? 

   使用@property和@synthesize很方便,但又给我们带来了很多疑问比如在上面的代码中又出现了nonatomic和copy,是什么意思?在@property中还有其他几个关键字,它们都是有特殊作用的,我把它们分为三类分别是:原子性,访问器控制,内存管理。


    原子性

    atomic(默认):atomic意为操作是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的至少在当前的访器上我是安全的。它是一个默认的,但是很少使用。它的比较慢,这跟ARM平台和内部锁机制有关。 

    nonatomic: nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问。它的速度比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。 

    访问器控制

    readwrite(默认):readwrite是默认的,表示同时拥有setter和getter。 

    readonly: readonly 表示只有getter没有setter。 

    有时候为了语意更明确可能需要自定义访问器的名字: 

?
1
@property (nonatomic, setter = mySetter:,getter = myGetter ) NSString *name;
      最常见的是BOOL类型,比如标识View是否隐藏的属性hidden。可以这样声明

?
1
@property (nonatomic,getter = isHidden ) BOOL hidden;
      要注意修改setter或者getter的名字是存在副作用的,可能会使KVC和KVO无法正常工作。

    内存管理

    retain:使用了retain意味着实例变量要获取传入参数的所有权。具体表现在setter中对实例变量先release然后将参数 retain之后传给它。下面这段代码展示了retain类似的行为: 

?
1
2
3
4
5
6
7
8
-( void )setStuName:(NSString *)stuName
   {
      if (_stuName != stuName)
      {
         [_stuName release];
          _stuName = [stuName retain];
      }
   }

    assign(默认):用于值类型,如int、float、double和NSInteger,CGFloat等表示单纯的复制。还包括不存在所有权关系的对象,比如常见的delegate。

    strong:是在ARC伴随IOS引入的时候引入的关键字是retain的一个可选的替代。表示实例变量对传入的参数要有所有权关系即强引用。strong跟retain的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系。

    weak: weak跟assign的效果相似,不同的是weak在对象被回收之后自动设置为nil。而且weak智能用在iOS 5或以后的版本,对于之前的版本,使用unsafe_unretained。

    unsafe_unretained:weak的低版本替代。  

    copy:copy是为是实例变量保留一个自己的副本。


    现在明白了@property是怎么回事了,但是@synthesize是怎么回事,看看之前的第一段代码: 

?
1
@synthesize stuName = _stuName;
    这里的stuName = _stuName是什么意思?stuName是propertyName跟@property声明的名字一样。而后面的_stuName 是实例变量名。生成的访问器就是来访问的  _stuName的。代码的样子就和最开始那setter和getter代码所描述的一样。

    注意一个问题,我们并没有声明_stuName这个变量,这是编译器自动帮我们创建的。 如果这段指令我换个写法:@synthesize stuName = a;   并且我们没有在interface里面声明这个变量,那么会自动创建一个变量a。

   如果这里写成这样:

?
1
2
3
<em>@synthesize stuName;
//等同于
@synthesize stuName = stuName;</em>

    在Xcode4.4中,Xcode添加的一些新的编译特性其中一个就是默认合成(Default Synthesis)。默认合成就不再需要显示的使用@synthesize指令了,这很方便但是要注意的是,默认合成遵守的约定,这里的也就是命名规则是propertyName = _propertyName。 

  下面一段代码帮助理解:

?
1
2
3
4
//对于下面的@propety
@property (nonatomic, copy) NSString *stuName;
//默认合成的规则是这样:
@synthesize stuName = _stuName;
MMCV安装后报错‘from mmcv import Config’?别慌,这是MMCV 2.0的锅!快速降级回退MMCV 1.x全指南 本文详细解析了MMCV 2.0版本升级导致的‘from mmcv import Config’报错问题,提供了从诊断到降级回退MMCV 1.x的完整解决方案。通过pipOpenMIM工具链的实操指南,帮助开发者快速解决版本冲突,确保项目稳定运行。 阅读详情

相关推荐

ADS基础教程12 - 参数扫描

在硬件设计、仿真以及调试阶段,很多时候需要找到一个合理的参数来使设计处于最优状态。前面所讲的调优方式是其中的最直接的手段。因此,本文将介绍ADS中如何指定元器件的参数为变量,并可以对变量设置相应的约束条件,来实现的变量进行多组参数的仿真结果的展示。在图形显示界面,添加一个Plot,并添加参数结果。此时,结果中会显示出所有的扫描结果。参数扫描的要素包含:新建变量、变量参数设置、扫描模型设置三个方面。如果找不到该图标,在菜单栏单击右键,弹出的对话框将。,弹出的选项卡中,将添加两个变量。点击菜单栏的仿真按钮。

XZ_ZC的博客 8082

Objective-C中的@synthesize

Objective-C @synthesize @property 批量声明

madoca的博客 1063

【WorkBuddy专栏36】从踩坑到上线——WorkBuddy代码开发避坑指南与部署完全手册

【WorkBuddy专栏36】从踩坑到上线——WorkBuddy代码开发避坑指南与部署完全手册

AI人人懂 853

objective-c属性@synthesize-=_obj的意义

看到一篇关于objective-c关于属性的解释,写的非常好,特意转载学习下。

u012186949的专栏 1432

Objective-C autosynthesis(自动合成)

Objective-C 语言中可以用 @property 标记快速创建属性,编译器会自动生成 setter、getter 方法,这个过程就叫自动合成。 此过程由编译器在编译期执行。 自动合成失效的情况 同时重写 setter、getter 重写了只读属性 getter 使用了 @dynamic 标记 在 protocol 中定义的所有属性 在 category 中定义的所有属性 重载父类的属...

weixin_34362991的博客 298

Objective-C中的@property@synthesize及点语法

Objective-C中的@property@synthesize及点语法都是与两个函数有关的,一是setter函数,另一个是getter函数 以前我们是这样来定义setter与getter函数的 @interface Dog:NSObject { int age; } -(void)setAge:(int)newAge; -(void)age; @end @implementati

出头天 3709

Objective-c @property@Synthesize

Objective-c中,使用@property来标识属性(一般是实例变量)。在实现文件中使用@synthesize标识所声明的变量,让系统自动生成设置方法获取方法。         也就是说@property@synthesize配对使用,让系统自动生成设置方法获取方法。         例: Test.h #import @interface Test:NSObject

2350

Objective-C中的@property@synthesize用法

@代表“Objective-C”的标志,证明您正在使用Objective-C语言   Objective-C语言关键词,@property@synthesize配对使用。   功能:让编译好器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。   如: 1、在头文件中: C代码   @property int count;

Eliot 1088

Object-C中@synthesize简单介绍

@synthesize通常写在.m文件中的@implementation中。用来自动生成属性的geter/seter方法。 原理: @synthesize 成员属性名称 会自动生成一个带下划线的成员变量,自动生成geterseter方法,但是,setergeter方法中只会给自动生成的代下划线的成员变量,不会给自身属性赋值。因此,写@synthesize的时候,后边写上:@synthesize people = _people;这样就会给属性赋值了。当自己写了geterseter方法后,如果不声.

JustinZYP的博客 935

objective-c中的@property,@synthesize等简易用法(八)

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7355833 在objective-c中,我们可以用new简单的代替alloc init,我们今天介绍的是类似于new这种简易用法的另一种OC特性,用@property,@synthe

holydancer的专栏 1万+

iOS中你可能没有完全弄清楚的(一)synthesize

1. 什么是synthesize synthesize中文意思是合成,代码中我们经常这样用。 @interface Test: NSObject @property (nonatomic, unsafe_unretained) int i; @end @implementation Test @synthesize i; @end 复制代码使用synthesize的2个步骤: 首先你要有在类...

weixin_33951761的博客 359

object-c 中@synthesize的用处

In your class implementation, you can use the @synthesize compiler directive to ask the compiler to generate the methods according to the specification in the declaration: @synthesize flag; ...

a564941464的专栏 258

Objective-C 中@synthesize @property 的用法

通常情况下@property @synthesize配对使用 @property用于.h文件中,@synthesize用于.m文件中 1、子头文件中: @property int var;//表示在.h文件中声明一个 var 这句等价于.h 文件中的以下两句 -(int) var; -(int) setVar:(int) newVar; 2、如果在头文件中有@proper

hwcptbtptp的专栏 433

WWDC 2012 Session笔记——405 Modern Objective-C

这是博主的WWDC2012笔记系列中的一篇,完整的笔记列表可以参看这里。如果您是首次来到本站,也许您会有兴趣通过RSS,或者通过页面下方的邮件订阅的方式订阅本站。 2007年的时候,Objective-C在TIOBE编程语言排名里还排在可怜的第45位,而随着移动互联网的迅速发展iPhone,iPad等iOS设备的广阔市场前景,Objective-C也迅速崛起,走进了开发者的视野。在最近的T

dean19900504的专栏 1205

基于深度学习的声学回声消除系统.zip

基于深度学习的声学回声消除系统.zip

鸡啄米VS2010/MFC入门教程.rar_MFC_鸡啄米 mfc_鸡啄米mfc

鸡啄米VS2010/MFC入门教程,入门初学资料

上一篇: ios的@property属性和@synthesize属性
下一篇: IOS欢迎界面Launch Screen动态加载广告
NEVER-SETTLE
博客等级 码龄14年 4粉丝 3原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值