assign: 简单赋值,不更改索引计数;对基础数据类型 (NSInteger)和C数据类型(int, float, double, char,等)
copy: 建立一个索引计数为1的对象,然后释放旧对象; 对NSString
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1; 对其他NSObject和其子类
具体解释:
Copy其实是建立了一个相同的对象,而retain不是:
比如一个NSString对象,地址为0×1111,内容为@”STR”
Copy到另外一个NSString之 后,地址为0×2222,内容相同,新的对象retain为1, 旧有对象没有变化
retain到另外一个NSString之 后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1
也就是说,retain是指针拷贝,copy是内容拷贝。在拷贝之前,都需要释放旧的对象。
assign/retain/copy具体的实现代码:
//get -(MyObject*)myObject{ return _myObject; } // assign -(void)setMyObject:(id)newValue{ _myObject = newValue; } // retain -(void)setMyObject:(id)newValue{ if (_myObject != newValue) { [_myObject release]; _myObject = [newValue retain]; } } // copy -(void)setMyObject:(id)newValue{ if (_myObject != newValue) { [_myObject release]; _myObject = [newValue copy]; } }
在m文件中的使用方式:
在m文件中为一个property变量赋值: 间接赋值: 1.加self. MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1; self.myObject = aMyObject; //myObject retainCount = 2; [aMyObject release];//myObject retainCount = 1; 2. 不加self. MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1; myObject = aMyObject; //myObject retainCount = 1; [aMyObject release];//对象己经被释放 直接赋值: 3.加self. self.myObject = [[MyObject alloc] init]; //myObject retainCount = 2; 4. 不加self. myObject = [[MyObject alloc] init]; //myObject retainCount = 1;
readonly表示这个属性是只读的,就是只生成getter方法,不会生成setter方法.
readwrite设置可供访问级别
nonatomic非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。
property
属性的操作:是为了为一个实例变量添加setter和getter方法
@property是一个预编译指令,用来自动声明属性的setter和getter方法。
@synthesize是一个预编译指令,表示在实现文件中创建该属性的setter和getter的代码
这里要注意一点(很重要):属性的名称不必与实例变量相等,但大多数情况下是一样的。
具体代码:
.h文件
#import <Foundation/Foundation.h> @interface Student : NSObject{ NSString *_name; //定义了一个实例变量 } @property (nonatomic, retain) NSString *name; //定义了一个property @end
.m文件
#import "Student.h" @implementation Student @synthesize name = _name; // 这里使用name属性为_name变量添加setter和getter方法 - (void)dealloc { [_name release]; _name = nil; [super dealloc]; } @end
相关推荐
在iOS开发中,Objective-C语言提供了@property关键字来声明属性,并且可以在属性声明时指定不同的内存管理行为,主要涉及到assign、retain和copy这三个关键字。为了深入理解这三者的区别,首先需要了解Objective-C的...
对于想要深入了解`@property` 和 `@synthesize` 的开发者来说,建议进一步学习Objective-C的内存管理模型,特别是关于引用计数(`retain count`)的概念,以及如何在ARC(Automatic Reference Counting)环境下使用这些...
@property关键字的由来是为了提供一种更简洁、更安全的方式来声明和实现setter和getter。当我们在类接口中声明一个@property,OC编译器会自动生成对应的setter和getter方法,同时处理内存管理(在ARC时代之前是...
使用`property`声明属性后,Objective-C会自动生成存取器,但也可以通过`@synthesize`关键字手动指定存取器的实现。同时,如果尝试在`readonly`属性上使用点语法赋值,编译器会报错。 在实际开发中,选择合适的`...
然而,Objective-C的`@property` 不仅仅涉及访问权限,它还涉及到自动合成(synthesis)和内存管理(例如,`copy`、`retain` 和 `assign`)。 在标题中提到的示例中,我们看到即使在Objective-C中声明了`@public`,...
在iOS开发中,`@property` 是Objective-C中的一个关键字,用于声明类的实例变量(ivar)并自动合成存取方法(setter和getter)。通过使用`@property`,开发者可以方便地控制实例变量的访问权限、内存管理策略、线程...
属性可以包含不同的特性,比如readwrite(读写)、readonly(只读)、nonatomic(非原子的)、atomic(原子的)、strong(强引用)、weak(弱引用)、assign(直接赋值)、copy(复制)等。 在iOS开发中,正确使用@...
在Objective-C中,`@property`是一个重要的关键字,它允许你声明一个对象的属性,并且自动为你生成setter和getter方法。这些方法用于设置和获取属性的值,使得代码更加简洁且易于理解。例如,`@property float a;`...
- 属性的声明与实现:`@property`, `@synthesize`, `retain`, `nonatomic`, `assign`, `readonly`, `copy` - 指针和基本类型的认识:Objective-C中的数据类型仅有指针和基本类型,如`BOOL` - 协议和分类的使用:`...
`ex4.m`可能包含对属性的声明、赋值和读取操作,以及理解属性的原子性(atomicity)和内存管理策略(如nonatomic或retain)。 4. **协议(Protocol)**: Objective-C支持协议,这类似于Java和C#的接口。协议定义...
@synthesize propertyName = _myInstanceVariable; ``` ### 八、变量声明 Objective-C支持多种类型变量的声明: ```objective-c anytype myVariable; int i, j, k, l; float f; double d; BOOL b; ClassName *c; ...
@property (nonatomic, assign) int showLap; - (void)calculateShowFrame; @end ``` 1. **接口定义**:`PMarquee`类继承自`UIView`,并定义了两个属性`dicShowImage`和`showTextsList`用于存储图片和文字信息,...
@property (nonatomic, assign) int age; @end @implementation Member @synthesize name = _name; @synthesize age = _age; - (NSString *)name { return self.name; } - (int)age { return self.age; } - ...
- 属性修饰符:`readonly`、`readwrite`、`assign`、`atomic`、`nonatomic`、`copy`、`retain`等。 - 自动合成:使用`@synthesize`自动创建属性对应的实例变量和存取方法。 6. **内存管理**: - **引用计数**:...