`
lizhuang
  • 浏览: 904177 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

strong,weak, retain, assign的区别

 
阅读更多
strong与weak是由ARC新引入的对象变量属性
xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的。xcode 4.3(ios5和以上版本)之后就有了ARC,并且开始使用
strong与weak




assign: 用于非指针变量。用于
基础数据类型 (例如NSInteger)和C数据类型(int, float, double, char, 等),另外还有id
如:
@property (nonatomic, assign) int number;
@property (nonatomic, assign) id className;//id必须用assign
反正记住:前面不需要加 “*” 的就用assign吧


retain:用于指针变量。就是说你定义了一个变量,然后这个变量在程序的运行过程中会被更改,并且影响到其他方法。一般是用于字符串( NSString,NSMutableString),数组(NSMutableArray,NSArray),字典对象,视图对象(UIView ),控制器对象(UIViewController)等
比如:
@property (nonatomic,retain) NSString * myString;
@property (nonatomic, retain) UIView * myView;
@property (nonatomic, retain) UIViewController * myViewController;
xcode 4.2不支持ARC,所以会频繁使用retain来修饰,用完释放掉,而xcode4.3支持ARC,可以使用retian,不需要手动释放内存,系统会自动为你完成,如果你在xcode4.3上面开发,retian和strong都是一样的,没区别


strong和weak:
事实上
@property(nonatomic,strong) MyClass *myObject;就是相当于@property(nonatomic,retain) MyClass *myObject;@property(nonatomic, weak )id<RNNewsFeedCellDelegate>delegate;就是相当于@property(nonatomic,assign )id<RNNewsFeedCellDelegate>delegate;
现在系统自动生成的属性都是用weak来修饰的,我想应该是xcode 4.2不支持ARC,所以大家都是用retain。现在xcode4.3支持ARC了,于是苹果建议程序员放弃retain,以后都用weak。
weak 就是相当于assign,同样可以在xcode4.3开发环境下放弃使用assign 使用weak 来代替


unsafe_unretained
unsafe_unretained 就是ios5版本以下的 assign ,也就是 unsafe_unretained , weak, assign 三个都是一个样的。 因为 ios5用的是 weak ,那在ios4.3就用不了,如果你将 weak 修改为 unsafe_unretained ,那就可以用了。说到底就是iOS 5之前的系统用该属性代替 weak 来使用。


copy:这个东西估计是大部分人最不容易搞明白的东西,我也搞不明白。听别人说这个东西基本不用了,效果其实和retain没什么两样,唯一的区别就是copy只用于NSString而不能用于NSMutableString。
不过好像当一个类继承NSObject,那么这个类里面的属性需要使用copy,比如:
#import <Foundation/Foundation.h>
#import <MapKit/MKAnnotation.h>
@interface Annotation : NSObject <MKAnnotation> {
       
        CLLocationCoordinate2D coordinate;
        NSString *title;
        NSString *subtitle;
}
@property (nonatomic) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;
@end
反正以后就这么用就是了



反正就记住一点:xcode4.2用retain和assign ;xcode4.3或以上版本用strong与weak 。以前用xcode4.2开发程序的程序员会习惯用retain ,所以代码都是retian的,新手如果从xcode4.3学起的话就用strong与weak  吧,这里面讲的区别有些不对的地方。

readonly
此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在@implementation中只需要一个读取器。或者如果你使用@synthesize关键字,也是有读取器方法被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。

readwrite
此标记说明属性会被当成读写的,这也是默认属性。设置器和读取器都需要在@implementation中实现。如果使用@synthesize关键字,读取器和设置器都会被解析。

assign
此标记说明设置器直接进行赋值,这也是默认值。在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。

retain
指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。(原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数——译者注)。

copy
它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论,请参考“复制”部分。

nonatomic
指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定nonatomic,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。


所以property的属性默认是:readwrite,assign, atomic(没有这个关键字
分享到:
评论

相关推荐

    对于Retain和Assign属性的理解

    在现代Swift编程中,虽然`Retain`和`Assign`已被`Strong`和`Weak`属性所取代,但它们背后的原理仍然相同。`Strong`相当于`Retain`,表示强引用,而`Weak`则类似`Assign`,是一种弱引用,不会影响对象的引用计数。 ...

    IOS中(assign,retain,copy,weak,strong)的区别以及nonatomic的含义

    iOS 中 assign、retain、copy、weak、strong 的区别以及 nonatomic 的含义 iOS 中,在声明@property 属性时,总是要在括号中写上assign、retain、copy、weak、strong 中的一个,这些修饰符有什么区别?下面我们来...

    iOS开发实习面试题目

    weak,assign,strong的意义和区别? atomic,nonatomic的意义和区别? OC中有没有多继承?OC中怎么实现多继承功能? category和subclass的异同?平时怎样选择? OC中的变量是怎样存储的? block是怎样改变外界的变量的?...

    iOS 对象属性详细介绍

    retain,strong, copy,weak,assign,readonly, readwrite, unsafe_unretained 下面来分别讲讲各自的作用和区别: retain,计数器加1, (增加一个指向内存的指针) 对应release(计数器-1) setter 方法对参数进行 ...

    2021iOS笔试题总结.pdf

    11. strong与weak,以及Unsafe_unretained与weak的区别: - strong表示强引用,ARC会自动插入retain。weak表示弱引用,类似于手动管理内存的assign。 - Unsafe_unretained与weak的区别在于,当对象被销毁后,weak...

    内存管理面试题1

    1. 代理(delegate)循环引用:通常使用weak或assign修饰delegate,防止强引用循环。 2. NSTimer循环引用:使用weakSelf或在适当时候释放定时器。 3. Block循环引用:在block内部使用weakSelf,但需要注意weakSelf在...

    iOS内存管理方面的面试题汇总

    1. `retain`(在ARC下等同于`strong`):增加对象的引用计数,对象不会被自动释放,除非引用计数降为0。 2. `copy`:创建对象的一个副本,通常用于NSString、NSArray、NSDictionary等不可变对象,确保修改不影响原...

    iOS面试题及答案

    本文总结了 iOS 面试题及答案,涵盖了 OC 语言的基本特点、#import 与 @class 的区别、类目优缺点、内存管理的基本原则、ARC 技术、垃圾回收机制、深浅复制、堆栈区差别、用户自定义对象的拷贝、定义属性时的赋值...

    2018最新iOS 面试题

    在ARC下,strong告诉编译器自动管理对象的所有权,而weak则不增加引用计数,类似手动管理的assign。另外,_unsafe_unretained与weak类似,但当所指对象被释放后,weak引用的变量会被置为nil,从而避免野指针。 面试...

    iOS开发中必备的OC知识

    属性可以有多种类型,包括strong, weak, assign, copy, retain等。strong属性意味着持有对象,防止其被释放,而weak属性则不持有对象,仅用于访问。属性能够简化实例变量的get和set方法的声明和使用。 方法(Method...

    史上最全的iOS面试题及答案 - 张明炜 - ITeye技术网站1

    - `strong`、`weak`、`retain`、`assign`、`copy` 和 `nonatomic` 是Objective-C中的属性修饰符。`strong`(或`retain`在非ARC环境下)用于保持对象的引用计数,`weak`用于弱引用,防止循环引用,`assign`适用于非...

    C++教程渥瑞达objective-c视频教程内含有 du盘链接

    Objective-C提供了几种关键字来帮助开发者管理对象的生命周期:`strong`、`weak`、`copy`、`retain`、`assign`等。例如: - `strong`: 对象被强引用,对象生命周期由引用者决定。 - `weak`: 弱引用,当没有强引用时...

    史上最全的iOS面试题及答案

    - **strong、weak、retain、assign、copy等的区别**: - **strong**:强引用,对象的所有权归当前属性所有,会增加对象的引用计数。 - **weak**:弱引用,不增加对象的引用计数,当对象被释放后,指针会被置为nil...

    ios就业面试题.docx编程资料

    - **`strong`/`weak`**:`strong`表示强引用,用于持有对象,防止对象过早被释放;`weak`表示弱引用,用于避免强引用循环,当被引用的对象被释放时,`weak`属性会被置为`nil`。 5. **`copy`、`assign`和`retain`的...

    ios 面试题

    - **strong、weak、copy、assign:** - `strong`:表示强引用,ARC环境下相当于`retain`。当对象的最后一个强引用消失时,该对象会被销毁。 - `weak`:表示弱引用,ARC环境下相当于`assign`。当被弱引用的对象被...

    详解iOS应用开发中的ARC内存管理方式

    除了`strong`之外,Objective-C还提供了其他类型的引用,如`weak`、`unsafe_unretained`和`assign`,它们在不同的场景下有不同的用途。`weak`用于弱引用,不增加对象的引用计数,通常用于实现代理或防止循环引用。`...

    iOS面试题分享

    - `strong`(ARC下默认):与`retain`类似,但在ARC环境中使用。 - `weak`(ARC下):弱引用,不增加对象的引用计数,当对象被释放时自动设为nil,防止野指针。 关于类变量的访问控制修饰符: - `@private`:仅在类...

Global site tag (gtag.js) - Google Analytics