`
iaiai
  • 浏览: 2196617 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Objective-C中 copy, tetain, assign , readonly , readwrite, nonatomic区别

 
阅读更多
nonatomic:非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。
(atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所 以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。)

assign: 简单赋值,不更改索引计数
对基础数据类型 (例如NSInteger)和C数据类型(int, float, double, char, 等)     适用简单数据类型

copy:建立一个索引计数为1的对象,然后释放旧对象对NSString

retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
对其他NSObject和其子类

//——————————————————————————
看了这么多也许大家有点晕, 现在进行实际的代码演示:

@property (nonatomic, assign) int number;
这里定义了一个int类型的属性, 那么这个int是简单数据类型,本身可以认为就是原子访问,所以用nonatomic,  不需要进行引用计数,所以用assign。 适用于所有简单数据类型。

@property (nonatomic, copy) NSString * myString;
这里定义了一个NSString类型的属性,不需要原子操作,所以用nonatomic.
为什么需要copy,而不是retain呢! 因为如果对myString赋值原字符串是一个可变的字符串(NSMutableString)对象的话,用retain的话,当原字符串改变的时候你的myString属性也会跟着变掉。我想你不希望看到这个现象。 实际上博主测试, 如果原来的字符串是NSString的话,也只是retain一下,并不会copy副本

@property (nonatomic, retain) UIView * myView;
这里定义了一个UIView类型的属性,不需要原子操作,所以用nonatomic.
当对myView 赋值的时候原来的UIView对象retainCount会加1

//接口文件
@interface MyClass : NSObject
@property (nonatomic, assign)   int              number;
@property (nonatomic, copy)   NSString  * myString;
@property (nonatomic, retain) UIView    * myView;
@end

//实现文件
@implementation MyClass
@synthesize number;
@synthesize myString;
@synthesize myView;

//释放内存
-(void) dealloc
{
[myString release];  //copy的属性需要release;
[myView release];    //retain的属性需要release;

[super dealloc]; //传回父对象
}

@end

假如你有一段代码创建了一个MyClass对象

MyClass * instance  = [MyClass alloc] init];

//number赋值,没什么可说的, 简单数据类型就这样
instance.number = 1;

//创建一个可变字符串
NSMutableString * string = [NSMutableString stringWithString:@"hello"];

instance.myString = string;                   //对myString赋值

[string appendString:@" world!"];      //往string追加文本

NSLog(@”%@”,string);                        //此处string已经改变, 输出为 “hello world!”

NSLog(@”%@”,instance.myString);   //输出myString,你会发现此处输出仍然为 “hello” 因为 myString在string改变之前已经copy了一份副本

UIView * view = [[UIView alloc] init];
NSLog(@”retainCount = %d”,view.retainCount);
//输出view的引用计数, 此时为1

instance.myView = view; //对myView属性赋值

NSLog(@”retainCount = %d”,view.retainCount);
//再次输出view的引用计数, 此时为2,因为myView对view进行了一次retain。

[view release];
//此处虽然view被release释放掉了,但myView对view进行了一次retain,那么myView保留的UIView的对象指针仍然有效。

[instance release] ;
分享到:
评论

相关推荐

    Objective-C Cheatsheet

    - @property默认创建的是readwrite(读写)属性,可声明readonly(只读)属性。 6. 使用属性: - 属性会自动创建私有实例变量。 - @synthesize关键字用于手动合成属性的getter和setter方法。 - 使用点语法...

    Objective-C Cheat Sheet

    - `readwrite`:创建getter和setter(默认) - `readonly`:仅创建getter ### 七、属性合成 为了实现属性,需要在实现文件中合成它们: ```objective-c @synthesize propertyName; // 或者 @synthesize property...

    Objective-C 速查手册 1.2 (ARC版)

    - `@property` 用于声明属性,可以指定线程安全(`@synchronized`)、读写权限(`readwrite`, `readonly`)、引用类型(`strong`, `weak`)、赋值方式(`assign`, `copy`)等属性。 ##### 类实现文件(.m) 类实现...

    objective-c资料

    Objective-C,简称OC,是苹果公司开发的一种面向对象的编程语言,它在iOS和macOS应用开发中扮演着核心角色。这份"Objective-C资料"显然包含了一些关于OC的基础知识,特别是关于属性(properties)和访问器...

    Objective-c 学习 (2).doc

    Objective-C 是苹果开发环境中的主要编程语言,尤其在iOS和macOS应用开发中占据核心地位。在Objective-C中,`property`是面向对象编程中的一个重要概念,它允许开发者声明类的实例变量,并自动生成对应的存取方法...

    Objective-C基础教程.docx

    - 属性修饰符:`readonly`、`readwrite`、`assign`、`atomic`、`nonatomic`、`copy`、`retain`等。 - 自动合成:使用`@synthesize`自动创建属性对应的实例变量和存取方法。 6. **内存管理**: - **引用计数**:...

    ios_assign,retain和copy详解

    在iOS开发中,Objective-C语言提供了@property关键字来声明属性,并且可以在属性声明时指定不同的内存管理行为,主要涉及到assign、retain和copy这三个关键字。为了深入理解这三者的区别,首先需要了解Objective-C的...

    Ios retain assign区别

    本文将详细解释`retain`和`assign`的区别,以及其他相关的属性修饰符如`readonly`、`readwrite`、`nonatomic`等,帮助读者更好地理解这些关键字的作用及其应用场景。 #### `retain`与`assign` **1. `retain`** - *...

    object-c基础教程.pdf

    Objective-C提供了一个强大的属性系统,支持自动内存管理(如retain和assign)、原子性(nonatomic或atomic)以及读写权限(readonly, readwrite)。 5. **方法语法**:Objective-C的方法声明采用消息语法,如`- ...

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

    本篇文章详细介绍了iOS开发中的一些常见属性设置,包括readwrite、readonly、retain、copy、assign以及nonatomic。 1. 可读性: - `readwrite`:这是变量的默认属性,如果没有明确指定其他属性,变量就会具有读写...

    阿里p4-p6面试题.pdf

    - 文档中提到了几种属性关键字:readwrite, readonly, assign, retain, copy, nonatomic。 - readwrite和readonly用于指定属性是否可读写,readwrite可以读写,而readonly只能读。 - assign通常用于基本数据类型...

    举例讲解Objective-C中@property属性的用法

    此外,还可以使用其他关键字来定制属性行为,如`readonly`、`readwrite`(默认)、`assign`、`strong`(ARC环境下代替`retain`)、`weak`等。这些关键字帮助开发者更好地管理内存和控制属性的行为。 总之,...

    iOS面试大全.docx

    - `readwrite`:默认的属性特性,提供getter和setter方法。 - `readonly`:只提供getter方法,不允许外界修改属性。 - `assign`:简单赋值,不会增加引用计数。 - `retain`:在setter中会对传入的对象进行retain...

    iosiOS面试宝典

    - **readwrite**: 默认属性,表示生成getter和setter方法。 - **readonly**: 只生成getter方法,不允许外部修改该属性。 - **assign**: 指定使用赋值操作符来处理属性,适用于基本数据类型。 - **retain**: 表示使用...

    8.1《iOS开发笔试题600道-笔试手写篇》(2).pdf

    属性可以包含不同的特性,比如readwrite(读写)、readonly(只读)、nonatomic(非原子的)、atomic(原子的)、strong(强引用)、weak(弱引用)、assign(直接赋值)、copy(复制)等。 在iOS开发中,正确使用@...

    iphone面试题

    - `readwrite`:默认值,表示属性既可读也可写。 - `readonly`:只读属性。 - `assign`:用于基本数据类型,如int、float等。 - `retain`:用于对象类型,增加对象引用计数。 - `copy`:创建对象的深拷贝。 - `...

    IOS苹果开发面试宝典2018

    - **readwrite**: 默认属性,意味着同时生成getter和setter方法。 - **readonly**: 只生成getter方法,不允许外部通过setter方法修改该属性。 - **assign**: 直接将传入值赋给实例变量,适用于基本数据类型或不可变...

    iOS常见面试题

    #### 三、属性 `readwrite`,`readonly`,`assign`,`retain`,`copy`,`nonatomic` 各是什么作用,在那种情况下用? - **`readwrite`**: - 默认属性,表示同时生成get方法和set方法。 - 适用于需要可读写属性的...

Global site tag (gtag.js) - Google Analytics