当前位置: 首页 > news >正文

Objective-C属性介绍

我们知道在Objective-C中,使用@property配合@synthesize可以让编译器自动实现getter/setter方法,使用的时候也很方便,可以直接使用对象.属性的方法调用。



NSString* name; NSUInteger age; @property(nonatomic,copy)NSString* name; @property(assign)NSUInteger age; @synthesize name; @synthesize age;
那如果我们想要对象.方法的方式来调用一个方法并获取到方法的返回值,那就需要使用@property配合@dynamic了


@property(readonly)NSString* firstArrayValue; @dynamic firstArrayValue; - (NSString*)firstArrayValue { return [_array objectAtIndex:0]; }
这样就可以使用对象.firstArrayValue来获取到_array数组中的第一个值了,很显然,这种方法并不适用于需要传递参数的方法。

其实使用@dynamic关键字是告诉编译器由我们自己来实现访问方法。

如果使用的是@synthesize,那么这个工作编译器就会帮你实现了。

说明:代码只为示例代码,实际使用时每句代码要放到相应位置的。

===== 最后转载下关于@property(*)括号中的属性内容介绍 =====

readonly

此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在@implementation中只需要一个读取器。或者如果你使用@synthesize关键字,也是有读取器方法被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。

readwrite

此标记说明属性会被当成读写的,这也是默认属性。设置器和读取器都需要在@implementation中实现。如果使用@synthesize关键字,读取器和设置器都会被解析。

assign

此标记说明设置器直接进行赋值,这也是默认值。在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。

retain

指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。(原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数——译者注)

copy

它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论,请参考复制部分。

nonatomic

指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定 nonatomic ,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了 nonatomic ,那么访问器只是简单地返回这个值。

相关文章:

  • PAT 1061 判断题(15)(代码)
  • 【iOS-Cocos2d游戏开发】使用cocosBuiler制作cocos2d场景
  • 面试题——存储引擎
  • HTML(XHTML)基础知识(二)——【body】
  • 《性能测试诊断分析与优化》推荐序(2)
  • Go实现发送解析GET与POST请求
  • 转新浪微博 Facebook新园区黑客之路
  • N天学习一个Linux命令之dmesg
  • 数据越权访问,谁之错?
  • Spring STS Call Hierarchy 查找不到被调用的信息
  • 方格取数 2
  • jira中级使用说明(节选)
  • 道具研究(一)
  • Python3.6全栈开发实例[002]
  • 有爱游戏地图
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • ComponentOne 2017 V2版本正式发布
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • iOS | NSProxy
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Java精华积累:初学者都应该搞懂的问题
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • php的插入排序,通过双层for循环
  • quasar-framework cnodejs社区
  • webpack入门学习手记(二)
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 离散点最小(凸)包围边界查找
  • 实习面试笔记
  • 使用SAX解析XML
  • 微信小程序--------语音识别(前端自己也能玩)
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 阿里云服务器购买完整流程
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2015)JS ES6 必知的十个 特性
  • (C语言)fgets与fputs函数详解
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十三)Flask之特殊装饰器详解
  • .NET CLR基本术语
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • /3GB和/USERVA开关
  • @Import注解详解
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [2669]2-2 Time类的定义
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [BZOJ2850]巧克力王国
  • [C#小技巧]如何捕捉上升沿和下降沿
  • [C++]类和对象【下】
  • [CDOJ 838]母仪天下 【线段树手速练习 15分钟内敲完算合格】