iOS学习笔记(4)@property和类型之间用括号添加一些额外的指示符的作用

  当使用@property定义property时,还可在@property和类型之间用括号添加一些额外的提示符,可使用的特殊指示符如下

  · assign:该指示符指定对属性只是进行简单赋值,不更改对所赋的值的引用计数。这个指示符主要适用于NSInteger等基础类型,以及short、float、double、结构体等各种C数据类型。

  提示:引用计数是Objective-C内存回收的概念,当一个对象的引用计数大于0时,表明该对象还不应该被回收,由于NSInteger等基础类型,以及short、float、double、结构体等各种C数据类型都不存在回收的问题,因此使用assign即可。

  · atomic(nonatomic):指定合成的存取方法是否为原子操作。所谓原子操作,主要指是否线程安全。如果使用atomic,那么合成的存、取方法都是线程安全的——当一个线程进入存、取方法的方法体之后,其他线程无法进入该存、取方法,这样就可以避免多线程并发破坏对象数据完整性,atomic是默认值。虽然atomic可以保证对象数据的完整性,但atomic的线程安全会造成性能下降,因此,大多数单线程环境下,我们都会考虑使用nonatomic来提高存取方法的访问性能。

  · copy:如果使用copy指示符,当调用setter方法对成员变量赋值时,会将被赋值的对象复制一份副本,再将该副本赋值给成员变量。copy指示符会将原成员变量所引用对象的引用计数减1。当成员变量的类型是可变类型,或其子类是可变类型时,被赋值的对象有可能在赋值之后被修改,如果程序不需要这种修改影响setter方法设置的成员变量的值,此时就可考虑使用copy指示符。

  · getter、setter:这两个指示符用于为合成的getter方法、setter方法指定自定义方法名。例如,getter=abc指定getter方法的方法名为abc;setter=xyz: (因此setter方法要带参数,不要忘记了冒号),则指定setter方法的方法名为xyz:。

  · readonly、readwrite:readonly指示系统只合成getter方法,不再合成setter方法;readwrites是默认值,指示系统需要合成setter、getter方法。

  · retain:使用retain指示符定义属性时,当把某个属性赋值给该属性时,该属性原来所引用的对象的引用计数减1,被赋值对象的引用计数加1。

  提示:在未启用ARC机制的情况下,retain是一个很有用的指示符:当一个对象的引用计数大于1时,该对象不应该被回收,但启用ARC机制之后,一般较少使用retain指示符。

  · strong、weak:strong指示符指定该属性对被赋值对象持有强引用,而weak指示符指定该属性对被赋值对象持有弱引用。强引用的意思是:只要该强引用指 向被赋值的对象,那么该对象就不会自动回收;弱引用的意思是:即使该弱引用指向被赋值的对象,该对象也可能被回收。

  提示:在启动ARC机制时,使用strong、weak指示符将十分方便。如果程序不希望被该属性引用的对象被回收,那就应该使用strong指示符;如果程序需要保证性能,避免内存溢出,则可以使用weak指示符。使用weak指示符时需要小心,当程序通过该weak属性来访问被引用的对象时,该对象可能已经被回收了。对于声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。这样能有效地防止悬空指针。weak指示符可有效地帮我们防止悬空指针。

  · unsafe_unretained:这个指示符与weak指示符基本相似,对于只被unsafe_unretained指针所指向的对象,该对象也可能被回收。与weak指针不同的是,当unsafe_unretained指针所引用的对象被回收后,unsafe_unretained指针不会被赋值为nil,因此这可能导致程序崩溃。一般来说,使用unsafe_unretained指示符不如使用weak指示符。

时间: 2024-10-13 22:31:56

iOS学习笔记(4)@property和类型之间用括号添加一些额外的指示符的作用的相关文章

IOS 学习笔记 2015-03-20 OC-数值类型

一 定义 在Objective-C中,我们可以使用c中的数字数据类型,int.float.long等.它们都是基本数据类型,而不是对象.也就是说,不能够向它们发送消息.然后,有些时候需要将这些值作为对象使用. 二 关键字 1 NSInteger int 包装类型 A 当你不知道程序运行哪种处理器架构时,你最好使用NSInteger,因为在有可能int在32位系统中只是int类型, 而在64位系统,int可能变是long型.除非不得不使用int/long型,否则推荐使用NSInteger. B 从

IOS学习笔记 -- Modal和Quartz2D

一. Modal1.Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止;Modal只是改变了View的现实,没有改变rootViewController 2.常用方法1>.以Modal的形式展示控制器- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion2>.关

IOS学习笔记 -- 网络编程

一.HTTP协议1.面试题: 聊一下HTTP协议(表达对HTTP协议的看法)* HTTP协议的全称: 超文本传输协议, 定制传输数据的规范(客户端和服务器之间的数据传输规范)* 描述HTTP协议完整的通信过程 2.通信过程1> 请求* 客户端 --> 服务器* 请求的内容a."请求行" : 请求方法\请求资源路径\HTTP协议版本GET /MJServer/login?username=123&pwd=123&method=get&type=JSON

iOS学习笔记(1)— UIView 渲染和内容管理

iOS学习笔记(1)— UIView 渲染和内容管理 iOS中应用程序基本上都是基于MVC模式开发的.UIView就是模型-视图-控制器中的视图,在iOS终端上看到的.摸到的都是UIView. UIView在屏幕上定义了一个矩形区域和管理区域内容的接口.在运行时,一个视图对象控制该区域的渲染:UIView继承自UIResponder,UIResponder是用来响应事件的类,UIView也具有响应事件的能力.所以说UIView具有三个基本的功能,绘制内容并管理内容的布局,响应用户交互,动画.正是

iOS学习笔记-精华整理

iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放池就会被释放掉(调用dealloc),池中的对象都会收到一个release,有可能会因此被销毁. 2-成员属性:     readonly:不指定readonly,默认合成getter和setter方法.外界毫不关心的成员,则不要设置任何属性,这样封装能增加代码的独立性和安全

IOS学习笔记-- SQLite的应用

1 // 2 // HMViewController.m 3 // 02-SQLite的应用 4 // 5 // Created by apple on 14-7-24. 6 // Copyright (c) 2014年 heima. All rights reserved. 7 // 8 9 #import "HMViewController.h" 10 #import <sqlite3.h> 11 12 @interface HMViewController () 13

IOS学习笔记 -- 多线程

多线程1.多线程的原理 1>.同一时间,CPU只能处理1条线程,只有1条线程在工作(执行) 2>.多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换) 3>.如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象如果线程非常非常多,会发生: 1>.CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源 2>.每条线程被调度执行的频次会降低(线程的执行效率降低) 2.多线程的优缺点 1>.多线程的优点 能适当提高程序的执行效率 能适当提高资源

IOS学习笔记---C语言第四天

1 //?生成2个数组,每个数组都有10个元素,元素取值范围20-40之间,数组对应元素相 加,放到另外?一个数组中 2 #import <Foundation/Foundation.h> 3 4 int main(int argc, const char * argv[]) 5 { 6 7 int num1[10]={0},num2[10]={0},num3[10]={0}; 8 for (int i = 0; i<10; i++) { 9 num1[i]=arc4random()%2

iOS 学习笔记——0005(数据存储)

先发一个练手的小demo,自己写的简略通讯录,已上传至github https://github.com/liaoshaolim/addressBook 1.NSKeyedArchiver:(归档) 这里用一个添加联系人的例子来说明: 注意:归档形式保存数据,需要该对象遵守NSCoding协议,而且对应的必须提供encodeWithCoder和initWithCoder方法 因为归档是一次性的,解压也是一次性的,所以小量的ok,如果量大的话,改一个小地方就要归档或解压全部,效率会比较低 //用一