精华内容
下载资源
问答
  • iOS属性修饰符
    2015-09-13 11:16:15

    当我们使用property来定义属性的时候,往往会为属性添加很多的修饰符,例如:nonatomic、assign、copy、strong、weak等等,本文将讨论这些属性修饰符的作用。

    1、atomic
    这个英文单词直译过来的话,是“原子的”的意思,那么在iOS中,“原子”代表着处理事件的一个完整操作,我们利用atomic这个关键字来定义属性,那么这个属性的setter和getter方法将具有“原子性“。更进一步来说,就如当项目中涉及到了多线程的时候,这个被nonatomic定义的属性同时被多个线程调用setter方法,这时候,就不会出现在一个线程还没有结束调用的setter方法时,另外一个线程就开始调用这个属性的setter方法。另外的线程一直要等到正在调用setter方法的这个线程调用结束后,才会调用setter方法。所以总的来说,atomic是应用帮助我们解决了多线程问题,但是正是由于这些操作是应用帮我们完成的。所以,程序的运行效率会受到很多的影响。
    2、nonatomic
    通过对atomic的了解,我们知道了”原子性“是什么意思,那么nonatomic正是atomic的反义词,翻译成中文是”非原子的“。如果用nonatomic来定义一个属性,应用就不会帮助我们去使这个被定义的属性具有多线程的安全操作。但是,目前绝大多数的定义仍然是nonatomic,原因就在于,nonatomic的效率比atomic高,虽然他不是线程安全的,但是我们可以手动去在合适的位子进行设计添加线程安全的代码,比如在单例模式中利用GCD或者是手动添加锁来保证线程安全。
    3、修改setter和getter方法的名字
    在property中如果不对setter和getter方法的名字做处理,那么setter方法就是setName(这里用name来代替变量名 ),getter就是name,但是有些时候我们希望使用自己想的setter方法和getter方法的名字,就需要在property中写上setter = operation1 , getter = operation2 (这里的operation1和2是自己给出的名字),那么现在的setter和getter方法也就相应地改变了。
    4、readonly和readwrite
    承接上面第三点,如果在property中改了名字,那么就要注意,如果写上了修饰符readonly,那么setter方法就不应该进行重新命名。因为readonly表示这个属性只能够进行读取,也就是只有getter方法,没有setter方法。相反,readwrite这个表示属性既可以被读取,又可以被修改。默认的情况下是readwrite,所以我们如果不希望定义的属性被修改,那么就要手动写上readonly修饰符。
    5、copy和retain
    说到copy,大家都会想到字符串或者是数组和字典,不难发现,这三种类型都是有可变类型的,所以,使用copy在内存管理上更加安全,下面就从原理上来了解下。
    @property (nonatomic,retain) NSString *retainStr;
    @property (nonatomic,copy)  NSString *copyStr;
    - (void)test:
    {
        NSMutableString *tempStr = [NSMutableStringstringWithFormat:@"123"];
        self.retainStr = tempStr;
        self.copyStr = tempStr;
        NSLog(@"tempStr:%p,%p", tempStr,&tempStr);
        NSLog(@"retainStr:%p,%p", _retainStr, &_retainStr);
        NSLog(@"copyStr:%p,%p",   _copyStr, &_copyStr);
    }
    这里分别用retain和copy定义了两个字符串,然后在创建了一个可变字符串对象,然后分别将可变字符串对象赋值给定义的两个字符串,接着每个对象打印了两个值,第一个是变量的地址,第二个是变量指向的对象的地址。
    好了,现在可以进行分析:我们假设tempStr这个变量自身的地址为0x11,tempStr指向的对象也就是可变字符串对象123的地址为0x00,通过self.retainStr = tempStr;retainStr所指向的对象的地址也变成了0x00,而retainStr这个变量本身的地址为0x12,通过self.copyStr = tempStr;copyStr所指向的对象的地址变成了0x01,而不是0x00,所以他指向的不是原来的那个可变字符串,而是深拷贝出来一份对象,然后指向拷贝出来的对象的。copySte这个变量的地址为0x13。
    通过上述的分析,我们从原理上了解了copy和retain的不同,接下来我们继续执行代码,看看在某些情况下不使用copy会有什么样的影响
    [tempStr appendString:@"45"];
    NSLog(@"retainStr:%@",  _retainStr);
    NSLog(@"copyStr:%@",  _copyStr);
    改变tempStr的值,从123变成了12345,接着打印出retainStr和copyStr的值,我们发现,retainStr的值为12345,copyStr的值为123,而我们所希望得到的值也应该是123,而不是12345。相信大家也都明白为什么会发生这样的现象,retainStr这个变量和tempStr这个变量都是指向于0x00这个对象的,那么改变了0x00这个对象的值,打印出来的结果也会随之改变。但copyStr这个变量指向的对象是由0x00深复制出来的一份对象,地址为0x01,所以,0x00的改变不会对0x01造成影响,所以打印结果也不会改变。
    6、assign
    默认情况下,就是用assign修饰属性的,assign修饰基本数据类型或者是指针的弱引用(例如delegate),他所修饰的属性只是进行简单的指针传递,不会引起引用计数的改变。
    7、strong和weak
    对于这两个修饰符来说,都是随着ARC的出现而出现的,我们在iOS中可以将它们称为强引用和弱引用,强引用就是类似于retain这样的引用,直接决定了所指对象的存亡,如果一个对象不被任何一个强引用去引用,那么这个对象就会从内存中释放掉。相反,弱引用不决定对象的存亡,也就是说,一个对象无论有多少个弱引用,没有强引用还是会被释放掉。如果要通俗来讲,那么strong相当于retain,weak相当于assign(但是多了一个功能,那就是当使用weak定义的属性所指向的对象被销毁之后,会自动将这个属性设置为nil)。我们在自定义协议的时候,非ARC模式下就使用assign,ARC模式下就使用weak。

    更多相关内容
  • ios属性修饰符

    2021-07-27 20:18:31
    ios属性修饰符 property( n,copy)NSString *name; 当属性为copy是输出的是hello 当属性为strong 输出的是hellozs copy相当于复制了一份 不可变的给了 self.name 输出为hello ————————————————...

    ios属性修饰符

    property( n,copy)NSString *name;
    在这里插入图片描述
    当属性为copy是输出的是hello
    当属性为strong 输出的是hellozs

    copy相当于复制了一份 不可变的给了 self.name
    在这里插入图片描述
    输出为hello
    —————————————————————————
    block为什么要用copy
    在这里插入图片描述
    block忘记如何写 inlineblock
    在这里插入图片描述
    变成mrc
    block的三种存在形式
    在这里插入图片描述
    DemoBlock内部没有调用外部变量时存放在全局区(ARC和MRC下均是)
    DemoBlock2使用了外部变量,这种情况也正式我们平时所常用的方式,Block的内存地址显示在栈区,栈区的特点就是创建的对象随时可能被销毁,一旦被销毁后续再次调用空对象就可能会造成程序崩溃,在对block进行copy后,block存放在堆区.所以在使用Block属性时使用Copy修饰,而在ARC模式下,系统也会默认对Block进行copy操作
    ————————————————————————
    代理为什么要用weak 为了防止循环引用
    在这里插入图片描述
    在这里插入图片描述

    weak跟assgin 的区别

    在这里插入图片描述
    在这里插入图片描述
    assign修饰的内存地址不发生任何变化 但此时里面已经没东西了 野指针错误
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • iOS 属性修饰符

    2017-03-08 15:04:04
    1.读写性修饰符:readwrite | readonly readwrite:表明这个属性是可读可写的,系统为我们创建这个属性的setter和getter方法。 readonly:表明这个属性只能读不能写,系统只为我们创建一个getter方法,不会创建...

    1.读写性修饰符:readwrite | readonly

    readwrite:表明这个属性是可读可写的,系统为我们创建这个属性的setter和getter方法。

    readonly:表明这个属性只能读不能写,系统只为我们创建一个getter方法,不会创建setter方法

    2.setter相关修饰符:assign | retain | copy

    setter相关的修饰符表明setter方法应该如何实现

    assign:表示直接赋值,用于基本数据类型(NSInteger和CGFloat)和C数据类型(如int, float, double, char等)另外还有id类型,这个修饰符不会牵涉到内存管理。但是如果是对象类型,使用此修饰符则可能会导致内存泄漏或EXC_BAD_ACCESS错误

    retain:针对对象类型进行内存管理。如果对基本数据类型使用,则Xcode会直接报错。当给对象类型使用此修饰符时,setter方法会先将旧的对象属性release掉,再对新的对象进行一次赋值并进行一次retain操作

    copy:主要用在NSString类型,表示复制内容。

    系统默认属性是assign。retain是指针的复制,copy是内容的复制

    3.原子性修饰符:atomic | nonatomic

    atomic:表示是线程安全的。

    nonatomic:表示是非线程安全的,使用此属性性能会提高一些。

    系统默认是atomic

    4.getter和setter修饰符

    @property(getter = getMethodName, setter = setMethodName) Object *obj;

    这两个属性修饰符用于设置自定义生成的getter和setter方法名,使用之后将不再使用系统默认的setter和getter方法名。

     

    在@property修饰符中可以出现多个修饰符,分别用逗号分隔,但是,在上述修饰符中,1,2,3组中的属性分别之恩那个出现一个,只有4中可以同时出现。

     

     

    assign:用于非指针变量。用于基础数据类型(如NSInteger, CGFloat)和C数据类型(int, float, double, char等), 另外还有id类型。

                  记住:前面不需要加*的就用assign

    retain:用于指针变量。一般用于字符串(NSString, NSMutableString), 数组(NSMutableArray, NSArray),字典对象,视图对象(UIView),控制器对象(UIViewController)等

    strong类似于retain,weak类似于assign

     

    最简单的记忆:

    使用assign:对基础数据类型(如NSInteger, CGFloat)和C数据类型(int, float, double, char等), 另外还有id类型

    使用copy:对NSString类型

    使用retain:对其它NSObject和其子类

    展开全文
  • ios属性修饰符详解

    2016-06-14 21:43:25
    __weak 修饰变量,相当于弱引用,引用计数不会加一,也就是赋值给他的变量为 nil 了,他也会被释放,并置空 (null) */ } return 0 ; } 2016 - 06 - 14 21 : 22 : 44.794 TEST123[ 11421 : 146417 ]...
    //
    //  Person.h
    //  TEST123
    //
    //  Created by zhengbing on 6/14/16.
    //  Copyright © 2016 zhengbing. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    @property (nonatomic, copy) NSString *copiedString;
    
    @property (nonatomic) NSString *name;           //不会影响被赋值的字符串变量.
    @property (nonatomic,strong) NSString *name1;   //和默认效果一样,不会影响被赋值的字符串变量.
    @property (nonatomic,weak) NSString *name2;     //和默认效果一样,不会影响被赋值的字符串变量.
    @property (nonatomic,retain) NSString *name3;   //和默认效果一样,不会影响被赋值的字符串变量.
    @property (nonatomic,assign) NSString *name4;   //和默认效果一样,不会影响被赋值的字符串变量.
    
    @property (nonatomic) NSArray *arr;         //arr 置为 nil 之后,不会影响他赋值的变量值。
    @property (nonatomic,strong) NSArray *arr1; //和 arr 一样,说明默认为strong。
    @property (nonatomic,weak) NSArray *arr2;   //会被警告,arr 置为 nil 后,被赋值的变量也会为(null)。
    @property (nonatomic,retain) NSArray *arr3; //和 strong 一样。
    @property (nonatomic,assign) NSArray *arr4; //assign 简单赋值,不更改引用计数.
    
    @end
    
    
    
    //
    //  main.m
    //  TEST123
    //
    //  Created by zhengbing on 6/14/16.
    //  Copyright © 2016 zhengbing. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Person.h"
    
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // insert code here...
    
    
            Person *per = [[Person alloc] init];
    
            per.name = @"zhangsan";
            per.copiedString = @"copiedString";
            per.arr = @[@1,@2,@3];
    
    //        NSString *otherName = per.name;
    //        per.name = nil;
    //        
    //        NSLog(@"%@",otherName);
    
            __strong NSArray *strongArr = per.arr;
            per.arr = nil;
            NSLog(@"strongArr:%@",strongArr);
    
            __weak NSArray *weakArr = strongArr;
            strongArr = nil;
            NSLog(@"weakArr:%@",weakArr);
    
    /*
    
     __strong 修饰变量,相当于强引用,引用计数会加一,也就是赋值给他的变量为 nil 了,他也不会释放。
     __weak   修饰变量,相当于弱引用,引用计数不会加一,也就是赋值给他的变量为 nil 了,他也会被释放,并置空 (null)
    
     */
    
        }
        return 0;
    }
    
    2016-06-14 21:22:44.794 TEST123[11421:146417] otherArr:(
        1,
        2,
        3
    )
    2016-06-14 21:22:44.796 TEST123[11421:146417] strongArr:(null)
    Program ended with exit code: 0
    展开全文
  • ios-属性修饰符

    2019-04-19 00:38:49
    常用属性修饰符 // 成员变量 只能在自己类内部使用的 (自己的.m中使用) @interface someObject : NSObject { NSString *firstName; // 成员变量 私有 } @property (nonatomic, copy) NSString *lastName; // ...
  • 题目 @property (nonatomic, copy) NSMutableArray *array; NSMutableArray *array = [NSMutableArray ...这一点没想到 属性修饰符只有 copy,没有 mutableCopy 方法才有 mutableCopy 嗯,这点要分清 小编辑器 小而巧
  • iOS 属性修饰符面试题

    千次阅读 2022-03-02 08:35:12
    面试官 :介绍下ARC下,常用的属性修饰符及其作用? assign,strong,copy,weak atmoic/nonatomic 安全策略 reawrite/readonly 读写策略,访问权限 assign: 修饰基本数据类型(比如int,double,bool等),不...
  • ios属性修饰符总结

    千次阅读 2015-12-08 15:03:29
    ios属性修饰符总结 很多刚接触iOS的朋友对属性的@property的可选参数如何使用,什么情况下使用哪种选项不了解,也问了我很多这方面的知识,虽然知道怎么用,但是有些说不出其区别。在这里,再次深入学习一遍,对copy...
  • copy 在iOS开发中,对象之间传值都是使用引用计数器增加的方式,这种方式的适用于当对象的某属性的值改变时,引用该对象的不同指针会同时改变,因为这两个指针指向的是同一个内存地址,当一个指针执行的对象属性值...
  • iOS开发之属性修饰符

    2017-05-26 17:44:59
    iOS开发之属性修饰符 多线程的特性 读写特性 访问修饰符 修饰符的用法介绍 一、多线程特性 默认:automic 1、automic:原子的,表示线程安全。使用automic的目的是为了确保其他线程不再同一时间内访问形同的资源。...
  • IOS属性修饰符总结

    2016-05-17 16:14:37
    很多刚接触iOS的朋友,对property的可选参数如何使用,什么情况下使用哪种选项不了解,也问了我很多这方面的知识,虽然知道怎么用,但是有些说不出其区别。在这里,再次深入学习一遍,对copy/strong/weak/__weak/__...
  • iOS 属性修饰符的区别

    千次阅读 2016-07-17 17:00:57
    iOS5 之后,Apple 推出了ARC(自动引用计数)机制,推出了新的修饰符替代之前的修饰符 strong、weak简单说明 1:ARC环境下,strong代替retain.weak代替assign 2:weak的作用:在ARC环境下,,所有指向这个对象的w
  • 给大家介绍了iOS 各种修饰符的区别汇总,需要的朋友参考下吧
  • iOS 属性修饰符atomic的内部实现是怎么样的?能保证线程安全吗?1、内部实现在 objc4-723 的 Objective-C runtime 实现中,property 的 atomic 是采用 spinlock_t 也就是俗称的自旋锁实现的。// getter id objc_...
  • 2、属性标识符 类中的属性也可以加上标志: @property (assign/retain/strong/weak/unsafe_unretained/copy) Number* num 1、strong 表示指向并拥有该对象。其修饰的对象引用计数会增加1。该对象只要引用计数不...
  • atomic原子性,是否是绝对线程安全的,不是绝对线程安全怎么理解?... //有一个atomic的属性,表示是原子的 - (void)viewDidLoad { [super viewDidLoad]; //开启一个线程对intA的值+1 dispatc...
  • 开发iOS项目已两年有余,一直根据惯性思维,也一直用strong 来修饰NSString,NSArray,NSDictionary等,其实一直没注意到其中的细节问题!包括该修饰符号的意义以及内存地址的问题! 此文已NSArray来举例子: 使用...
  • 这几天项目中出现多处崩溃的问题,究其原因居然是属性修饰符使用不当造成,以前不是很明白他们的用法和带来的后果,只知道闷头使用,今天特意总结列出,以供学习 本篇参考...
  • 若属性的数据类型为NSString,属性修饰符用copy。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,285
精华内容 4,114
关键字:

ios属性修饰符