博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Variable property attributes or Modifiers in iOS
阅读量:4056 次
发布时间:2019-05-25

本文共 8339 字,大约阅读时间需要 27 分钟。

After reading so many Articles, SO posts and made demo apps to check Variable property attributes, I decided to put all the attributes information together

  1. atomic //default
  2. nonatomic
  3. strong=retain //default
  4. weak= unsafe_unretained
  5. retain
  6. assign //default
  7. unsafe_unretained
  8. copy
  9. readonly
  10. readwrite //default

Article is from:

01. atomic 

-Atomic means only one thread access the variable(static type).
-Atomic is thread safe.
-but it is slow in performance
-atomic is default behavior
-Atomic accessors in a non garbage collected environment (i.e. when using retain/release/autorelease) will use a lock to 
 ensure that another thread doesn't interfere with the correct setting/getting of the value.
-it is not actually a keyword.
Example :@property (retain) NSString *name;@synthesize name;

总结:设置成员变量的@property属性时,默认为atomic,提供多线程安全。在多线程下,提供原子操作是必要的,否则容易出错。atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。

02. nonatomic

-Nonatomic means multiple thread access the variable(dynamic type).
-Nonatomic is thread unsafe.
-but it is fast in performance
-Nonatomic is NOT default behavior,we need to add nonatomic keyword in property attribute.
-it may result in unexpected behavior, when two different process (threads) access the same variable at the same time.
Example:@property (nonatomic, retain) NSString *name;@synthesize name;
Explain:
Suppose there is an atomic string property called "name", and if you call [self setName:@"A"] from thread A, 
call [self setName:@"B"] from thread B, and call [self name] from thread C, then all operation on different thread will be performed serially which means if one thread is executing setter or getter, then other threads will wait. This makes property "name" read/write safe but if another thread D calls [name release] simultaneously then this operation might produce a crash because there is no setter/getter call involved here. Which means an object is read/write safe (ATOMIC) but not thread safe as another threads can simultaneously send any type of messages to the object. Developer should ensure thread safety for such objects.
If the property "name" was nonatomic, then all threads in above example - A,B, C and D will execute simultaneously producing any unpredictable result. In case of atomic, Either one of A, B or C will execute first but D can still execute in parallel.
总结:
禁止多线程,变量保护,提高性能, 指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定 nonatomic ,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了 nonatomic ,那么访问器只是简单地返回这个值。

03. strong (iOS4 = retain )

-it says "keep this in the heap until I don't point to it anymore"
-in other words " I'am the owner, you cannot dealloc this before aim fine with that same as retain"
-You use strong only if you need to retain the object.
-By default all instance variables and local variables are strong pointers.
-We generally use strong for UIViewControllers (UI item's parents)
-strong is used with ARC and it basically helps you , by not having to worry about the retain count of an object. ARC automatically releases it for you 
 when you are done with it.Using the keyword strong means that you own the object.

Example:@property (strong, nonatomic) ViewController *viewController;@synthesize viewController;

总结:任何时候,一个指针变量(poiter variable)保存了一个对象(Object), 那么这个对象就有了一个拥有者(owner),且将一直保持在内存中。

04. weak (iOS4 = unsafe_unretained )

-it says "keep this as long as someone else points to it strongly"
-the same thing as assign, no retain or release
-A "weak" reference is a reference that you do not retain.
-We generally use weak for IBOutlets (UIViewController's Childs).This works because the child object only 
 needs to exist as long as the parent object does.
-a weak reference is a reference that does not protect the referenced object from collection by a garbage collector.
-Weak is essentially assign, a unretained property. Except the when the object is deallocated the weak pointer is automatically set to nil
Example :@property (weak, nonatomic) IBOutlet UIButton *myButton;@synthesize myButton;
Explain:
Imagine our object is a dog, and that the dog wants to run away (be deallocated).
Strong pointers are like a leash on the dog. As long as you have the leash attached to the dog, the dog will not run away. If five people attach their leash to one dog, (five strong pointers to one object), then the dog will not run away until all five leashes are detached.
Weak pointers, on the other hand, are like little kids pointing at the dog and saying "Look! A dog!" As long as the dog is still on the leash, the little kids can still see the dog, and they'll still point to it. As soon as all the leashes are detached, though, the dog runs away no matter how many little kids are pointing to it.
As soon as the last strong pointer (leash) no longer points to an object, the object will be deallocated, and all weak pointers will be zeroed out.
When we use weak?
The only time you would want to use weak, is if you wanted to avoid retain cycles 
(e.g. the parent retains the child and the child retains the parent so neither is ever released).
总结:弱引用的作用是,当两个对象只存在互相引用,那ARC将释放对象的内存使用。

05. retain = strong

-it is retained, old value is released and it is assigned
-
retain specifies the new value should be sent -retain on assignment and the old value sent 
-release
-retain is the same as strong.
-apple says if you write retain it will auto converted/work like strong only.
-methods like "alloc" include an implicit "retain"
Example:@property (nonatomic, retain) NSString *name;@synthesize name;
总结:对其他NSObject和其子类对参数进行release旧值,再retain新值指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。(原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数——译者注)。注意: 把对象添加到数组中时,引用计数将增加对象的引用次数+1。

06. assign 

-assign is the default and simply performs a variable assignment
-assign is a property attribute that tells the compiler how to synthesize the property's setter implementation
-I would use 
assign for C primitive properties and 
weak for weak references to Objective-C objects.
Example:@property (nonatomic, assign) NSString *address;@synthesize address;

总结:对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char)等等。此标记说明设置器直接进行赋值,这也是默认值。在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。

07. unsafe_unretained

-unsafe_unretained is an ownership qualifier that tells ARC how to insert retain/release calls
-unsafe_unretained is the ARC version of assign.
Example:@property (nonatomic, unsafe_unretained) NSString *nickName;@synthesize nickName;

08. copy

-
copy is required when the object is mutable.
-
copy specifies the new value should be sent -copy on assignment and the old value sent 
-release.
-copy is  like retain returns an object which you must explicitly release (e.g., in dealloc) in non-garbage collected environments.
-if you use copy then you still need to release that in dealloc.
-Use this if you need the value of the object as it is at this moment, and you don't want that value to reflect any changes made by other 
 owners of the object. You will need to release the object when you are finished with it because you are retaining the copy.
Example:@property (nonatomic, copy) NSArray *myArray;@synthesize myArray;

总结:对NSString 它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。

09. readonly

-declaring your property as 
readonly you tell compiler to not generate setter method automatically.
-Indicates that the property is read-only.
-If you specify readonly, only a getter method is required in the 
@implementation block. If you use the
@synthesize directive in 
 the 
@implementation block, only the getter method is synthesized. Moreover, if you attempt to assign a value using the dot syntax, 
 you get a compiler error.
Example:@property (nonatomic, readonly) NSString *name;@synthesize name;

10. readwrite 

-setter and getter generated.
-Indicates that the property should be treated as read/write.
-This attribute is the default.
-Both a getter and setter method are required in the @implementation block. If you use the @synthesize directive in the implementation 
 block, the getter and setter methods are synthesized.
Example:@property (nonatomic, readwrite) NSString *name;@synthesize name;

文章来自:

转载地址:http://rhhci.baihongyu.com/

你可能感兴趣的文章
Linux 粘滞位 suid sgid
查看>>
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>
Winform多线程
查看>>
C# 托管与非托管
查看>>
Node.js中的事件驱动编程详解
查看>>
mongodb 命令
查看>>
MongoDB基本使用
查看>>
mongodb管理与安全认证
查看>>
nodejs内存控制
查看>>
nodejs Stream使用中的陷阱
查看>>
MongoDB 数据文件备份与恢复
查看>>
数据库索引介绍及使用
查看>>
MongoDB数据库插入、更新和删除操作详解
查看>>
MongoDB文档(Document)全局唯一ID的设计思路
查看>>
mongoDB简介
查看>>
Redis持久化存储(AOF与RDB两种模式)
查看>>
memcached工作原理与优化建议
查看>>
Redis与Memcached的区别
查看>>
redis sharding方案
查看>>