iOS开发之详谈属性设置readwrite、readonly、retain、copy、assign、nonatomic_IOS

具体详细介绍请看下文文字说明吧,本文介绍的非常详细。

1 . 可读性: readonly、readwrite

@property(readwrite,....) valueType value;

这个属性是变量的默认属性,就是如果你 (readwrite and readonly 都没有使用,那么你的变量就是 readwrite属性 ) ,通过加入 readwrite 属性你的变量就会有 get 和 set 方法。

property(readonly,...) valueType value;

这个属性变量就是表明变量只有可读方法,也就是说,你只能使用它的 get 方法。

2 . assign , setter 方法直接赋值,不进行任何 retain 操作,为了解决原类型与环循引用问题

3 . retain , setter 方法对参数进行 release 旧值再 retain 新值,所有实现都是这个顺序

4 . copy ,setter 方法进行 Copy 操作,与 retain 处理流程一样,先旧值 release ,再 copy 出新的对象,retainCount 为 1 。这是为了减少对上下文的依赖而引入的机制。

5 .nonatomic ,非原子性访问,不加同步,多线程并发访问会提高性能。

注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级 。 所以不加nonatomic 对与多线程是安全的 。

6 . retain vs. Copy

copy   :建立一个索引计数为 1 的对象,然后释放旧对象
retain :释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为 1

那上面的是什么该死的意思呢?

copy 其实是建立了一个相同的对象,而 retain 不是:

比如定义如下属性:

复制代码 代码如下:

@property (copy, nonatomic) NSString *testStr;

使用方法如下:

复制代码 代码如下:

 NSMutableString *str3 =[[NSMutableString alloc ]initWithString:@"Mutable String"
self.testStr = str3;
NSLog(@"%d", [self.testStr retainCount]);
NSLog(@"%d", [str3 retainCount]);

可以看到testStr和str3地址不同,retainCount都是1

如果把copy改为retain,那么他们指向相同的地址,retainCount为2.
明白了吧,retain是指针copy,指向同一地址,计数加1,而copy是把内容复制过来。

Objective-C 属性特性(assign , retain , copy , readonly , readwrite , atomic , nonatomic)

assign:指定setter方法用简单的赋值,这是默认操作。你可以对标量类型(如int)使用这个属性。你可以想象一个float,它不是一个对象,所以它不能retain、copy。

retain:指定retain应该在后面的对象上调用,前一个值发送一条release消息。你可以想象一个NSString实例,它是一个对象,而且你可能想要retain它。

copy:指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。

readonly:将只生成getter方法而不生成setter方法(getter方法没有get前缀)。

readwrite:默认属性,将生成不带额外参数的getter和setter方法(setter方法只有一个参数)。

atomic:对于对象的默认属性,就是setter/getter生成的方法是一个原子操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter的情况,相关于方法头尾加了锁一样。

nonatomic:不保证setter/getter的原子性,多线程情况下数据可能会有问题。

以上内容是小编给大家介绍的iOS开发之详谈属性设置readwrite、readonly、retain、copy、assign、nonatomic,希望大家喜欢。

时间: 2024-10-26 05:12:12

iOS开发之详谈属性设置readwrite、readonly、retain、copy、assign、nonatomic_IOS的相关文章

iOS开发中使用UILabel设置字体的相关技巧小结_IOS

一.初始化 复制代码 代码如下: UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(40, 40, 120, 44)];      [self.view addSubview:myLabel]; 二.设置文字 1.设置默认文本 复制代码 代码如下: NSString *text = @"标签文本"; myLabel.text = text; 效果: 2.设置标签文本(此属性是iOS6.0之后才出现,如若不是必要,不

IOS开发代码分享之设置UISearchBar的背景颜色_IOS

今天用到UISearchBar,之前网上提供的方法已经不能有效的去除掉它的背景色了,修改背景色方法如下: mySearchBar.backgroundColor = RGBACOLOR(249,249,249,1);     mySearchBar.backgroundImage = [self imageWithColor:[UIColor clearColor] size:mySearchBar.bounds.size];   //取消searchbar背景色 - (UIImage *)im

Android开发中Activity属性设置小结_Android

Activity是Android组件中最基本也是最为常见用的四大组件之一,在 android开发中 ,运用极为广泛,作为初学者需要熟练掌握,下例为Activity属性常用设置. android:allowTaskReparenting 是否允许activity更换从属的任务,比如从短信息任务 切换到浏览器任务. android:alwaysRetainTaskState 是否保留状态不变, 比如切换回home, 再从新打开, activity处于最后的状态 android:clearTaskOn

IOS开发中使用UIFont设置字体及批量创建控件_IOS

在IOS 中,使用[UIFont familyNames]这个方法获取72种系统字体. 使用[UIFont fontWithName:@"Zapfino" size:18]这个方法为空间中的文字设置字体和字号. 可以通过for循环批量定义控件并设置属性. 以下程序获取系统72种字体并存储在一个数组中,有两种方法,一种是通过for循环拿到每一种字体并添加到可变数组中,另一种是直接把72种字体赋值给一个数组. 注:在页面控件较少的情况下选择手动创建每个控件,在控件数量较大且有规律排布的时候

Android开发中Activity属性设置小结

Activity是Android组件中最基本也是最为常见用的四大组件之一,在 android开发中 ,运用极为广泛,作为初学者需要熟练掌握,下例为Activity属性常用设置. android:allowTaskReparenting 是否允许activity更换从属的任务,比如从短信息任务 切换到浏览器任务. android:alwaysRetainTaskState 是否保留状态不变, 比如切换回home, 再从新打开, activity处于最后的状态 android:clearTaskOn

iOS 开发之全局特性设置

大家有没有发现???发现什么呢?What? 在平常用的App中,每一页的导航栏的颜色和字体都是一样的,有些是背景图片,有些是通过UIColor设置的颜色背景,本人在以前开发中,每次都在每个页面写一次导航栏的背景.唉-,不要笑话me(大神请绕道) 好啦,废话不多说,说重点,其实我们可以在AppDelegate中设置全局导航栏的颜色和字体颜色 ,这样的设置使我们一劳永逸!//设置导航栏文字颜色 [[UINavigationBar appearance] setTintColor:[UIColor c

你必需的 10 款 iOS 开发工具

小编整理了10款必备的 iOS开发工具,让你的开发过程事半功倍. SourceTree SourceTree是一个免费的Mac软件,主要用于Git和Mercurial版本控制.它可以帮助你进行源代码控制计划,跟传统的复杂的命令行版本控制软件相比,SourceTree是一款独一无二的GUI工具.对于新手Git用户来说,SourceTree使用起来简单且高效,对于经验丰富的app开发人员来说,SourceTree有着非常强大的功能. Slash Slash是iOS的一个开源库,它为NSAttribu

iOS开发之全局变量

ios开发中,全局变量设置和调用方法如下: 在AppDelegate.h文件中设置全局变量: @interface ***AppDelegate{ NSString *myName; } @property (nonatomic, retain) NSString *myName; @end 在AppDelegate.m文件中实现全局变量: @synthesize myName; 假如在 CallBack页面调用,在CallBack.m中包含AppDelegate.h文件,并定义一个代理实例,如

iOS开发笔记--详解UILabel的相关属性设置_IOS

在iOS编程中UILabel是一个常用的控件,下面分享一下UILabel的相关属性设置的方法. 很多学习iOS6编程都是从storyboard开始,用到UILabel时是将控件拖到storyboard中生成实现,如果想要在-(void)viewDidLoad中用代码如[_label initWithFrame:CGRectMake(X,Y,WIDTH,HEIGHT)]方法改变拖拽到storyboard的label的大小是行不通的,因为程序加载时先执行了-(void)viewDidLoad的代码,