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] ;
相关推荐
本文将详细解释`retain`和`assign`的区别,以及其他相关的属性修饰符如`readonly`、`readwrite`、`nonatomic`等,帮助读者更好地理解这些关键字的作用及其应用场景。 #### `retain`与`assign` **1. `retain`** - *...
- `readwrite`:创建getter和setter(默认) - `readonly`:仅创建getter ### 七、属性合成 为了实现属性,需要在实现文件中合成它们: ```objective-c @synthesize propertyName; // 或者 @synthesize property...
在iOS开发中,Objective-C语言提供了@property关键字来声明属性,并且可以在属性声明时指定不同的内存管理行为,主要涉及到assign、retain和copy这三个关键字。为了深入理解这三者的区别,首先需要了解Objective-C的...
Objective-C 是苹果开发环境中的主要编程语言,尤其在iOS和macOS应用开发中占据核心地位。在Objective-C中,`property`是面向对象编程中的一个重要概念,它允许开发者声明类的实例变量,并自动生成对应的存取方法...
Objective-C,简称OC,是苹果公司开发的一种面向对象的编程语言,它在iOS和macOS应用开发中扮演着核心角色。这份"Objective-C资料"显然包含了一些关于OC的基础知识,特别是关于属性(properties)和访问器...
- 属性修饰符:`readonly`、`readwrite`、`assign`、`atomic`、`nonatomic`、`copy`、`retain`等。 - 自动合成:使用`@synthesize`自动创建属性对应的实例变量和存取方法。 6. **内存管理**: - **引用计数**:...
本篇文章详细介绍了iOS开发中的一些常见属性设置,包括readwrite、readonly、retain、copy、assign以及nonatomic。 1. 可读性: - `readwrite`:这是变量的默认属性,如果没有明确指定其他属性,变量就会具有读写...
Objective-C提供了一个强大的属性系统,支持自动内存管理(如retain和assign)、原子性(nonatomic或atomic)以及读写权限(readonly, readwrite)。 5. **方法语法**:Objective-C的方法声明采用消息语法,如`- ...
- 文档中提到了几种属性关键字:readwrite, readonly, assign, retain, copy, nonatomic。 - readwrite和readonly用于指定属性是否可读写,readwrite可以读写,而readonly只能读。 - assign通常用于基本数据类型...
- `readwrite`:默认的属性特性,提供getter和setter方法。 - `readonly`:只提供getter方法,不允许外界修改属性。 - `assign`:简单赋值,不会增加引用计数。 - `retain`:在setter中会对传入的对象进行retain...
- **readwrite**: 默认属性,表示生成getter和setter方法。 - **readonly**: 只生成getter方法,不允许外部修改该属性。 - **assign**: 指定使用赋值操作符来处理属性,适用于基本数据类型。 - **retain**: 表示使用...
此外,还可以使用其他关键字来定制属性行为,如`readonly`、`readwrite`(默认)、`assign`、`strong`(ARC环境下代替`retain`)、`weak`等。这些关键字帮助开发者更好地管理内存和控制属性的行为。 总之,...
#### 三、属性 `readwrite`,`readonly`,`assign`,`retain`,`copy`,`nonatomic` 各是什么作用,在那种情况下用? - **`readwrite`**: - 默认属性,表示同时生成get方法和set方法。 - 适用于需要可读写属性的...
- **readwrite**: 默认属性,意味着同时生成getter和setter方法。 - **readonly**: 只生成getter方法,不允许外部通过setter方法修改该属性。 - **assign**: 直接将传入值赋给实例变量,适用于基本数据类型或不可变...
属性可以包含不同的特性,比如readwrite(读写)、readonly(只读)、nonatomic(非原子的)、atomic(原子的)、strong(强引用)、weak(弱引用)、assign(直接赋值)、copy(复制)等。 在iOS开发中,正确使用@...
- `readwrite`:默认值,表示属性既可读也可写。 - `readonly`:只读属性。 - `assign`:用于基本数据类型,如int、float等。 - `retain`:用于对象类型,增加对象引用计数。 - `copy`:创建对象的深拷贝。 - `...
iOS 中的属性可以分为六种:readwrite、readonly、assign、retain、copy、nonatomic。每种属性都有其特定的作用和使用场景: * readwrite:同时生成 get 方法和 set 方法的声明和实现。 * readonly:只生成 get ...
- 属性的声明与实现:`@property`, `@synthesize`, `retain`, `nonatomic`, `assign`, `readonly`, `copy` - 指针和基本类型的认识:Objective-C中的数据类型仅有指针和基本类型,如`BOOL` - 协议和分类的使用:`...