`

关键字retain copy assign nonatomic property synthesize

    博客分类:
  • ios
 
阅读更多

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_assign,retain和copy详解

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

    iOS开发中属性 property 和 synthesize 详解

    对于想要深入了解`@property` 和 `@synthesize` 的开发者来说,建议进一步学习Objective-C的内存管理模型,特别是关于引用计数(`retain count`)的概念,以及如何在ARC(Automatic Reference Counting)环境下使用这些...

    OC-模型的Setter,Getter的由来,@property的由来

    @property关键字的由来是为了提供一种更简洁、更安全的方式来声明和实现setter和getter。当我们在类接口中声明一个@property,OC编译器会自动生成对应的setter和getter方法,同时处理内存管理(在ARC时代之前是...

    Objective-c 学习 (2).doc

    使用`property`声明属性后,Objective-C会自动生成存取器,但也可以通过`@synthesize`关键字手动指定存取器的实现。同时,如果尝试在`readonly`属性上使用点语法赋值,编译器会报错。 在实际开发中,选择合适的`...

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

    然而,Objective-C的`@property` 不仅仅涉及访问权限,它还涉及到自动合成(synthesis)和内存管理(例如,`copy`、`retain` 和 `assign`)。 在标题中提到的示例中,我们看到即使在Objective-C中声明了`@public`,...

    IOS开发之@property的详细介绍

    在iOS开发中,`@property` 是Objective-C中的一个关键字,用于声明类的实例变量(ivar)并自动合成存取方法(setter和getter)。通过使用`@property`,开发者可以方便地控制实例变量的访问权限、内存管理策略、线程...

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

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

    objective-c资料

    在Objective-C中,`@property`是一个重要的关键字,它允许你声明一个对象的属性,并且自动为你生成setter和getter方法。这些方法用于设置和获取属性的值,使得代码更加简洁且易于理解。例如,`@property float a;`...

    iOS工程师培养计划

    - 属性的声明与实现:`@property`, `@synthesize`, `retain`, `nonatomic`, `assign`, `readonly`, `copy` - 指针和基本类型的认识:Objective-C中的数据类型仅有指针和基本类型,如`BOOL` - 协议和分类的使用:`...

    科施恩 Objective-C2.0程序设计Chap2答案

    `ex4.m`可能包含对属性的声明、赋值和读取操作,以及理解属性的原子性(atomicity)和内存管理策略(如nonatomic或retain)。 4. **协议(Protocol)**: Objective-C支持协议,这类似于Java和C#的接口。协议定义...

    Objective-C Cheat Sheet

    @synthesize propertyName = _myInstanceVariable; ``` ### 八、变量声明 Objective-C支持多种类型变量的声明: ```objective-c anytype myVariable; int i, j, k, l; float f; double d; BOOL b; ClassName *c; ...

    ios_自定义图文混排走马灯.txt

    @property (nonatomic, assign) int showLap; - (void)calculateShowFrame; @end ``` 1. **接口定义**:`PMarquee`类继承自`UIView`,并定义了两个属性`dicShowImage`和`showTextsList`用于存储图片和文字信息,...

    Objective-c 学习 (1)

    @property (nonatomic, assign) int age; @end @implementation Member @synthesize name = _name; @synthesize age = _age; - (NSString *)name { return self.name; } - (int)age { return self.age; } - ...

    Objective-C基础教程.docx

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

Global site tag (gtag.js) - Google Analytics