@property并在Objective-C中保留,分配,复制,非primefaces

作为Objective-C的新手,有人可以给我一个关于保留,分配,复制以及其他任何我缺less的内容的概述,它遵循@property指令? 他们在做什么,为什么我要用一个在另一个?

MrMage链接的文章不再工作。 所以,这就是我在(非常)短时间编码Objective-C中学到的东西:

非primefaces对primefaces – “primefaces”是默认的。 始终使用“非primefaces”。 我不知道为什么,但是我读的那本书说“使用primefaces”“很less有理由”。 (顺便说一句:我读的书是BNR的“iOS编程”一书。)

readwrite与readonly – “readwrite”是默认的。 当你@synthesize,一个getter和一个setter将为你创build。 如果使用“只读”,则不会创buildsetter。 使用它作为一个你不希望在对象实例化之后改变的值。

保留与复制与分配

  • “分配”是默认值。 在由@synthesize创build的setter中,该值将被简单地分配给该属性。 我的理解是“分配”应该用于非指针属性。
  • 当属性是指向对象的指针时,需要“保留”。 @synthesize生成的setter将保留(也就是添加保留计数)对象。 完成后您需要释放对象。
  • 当对象是可变的时候需要“复制”。 如果此时需要对象的值,则可以使用此值,而不希望该值反映对象的其他所有者所做的任何更改。 您将需要释放对象,因为您保留副本。

在您了解@property的属性之前,您应该知道@property的用法。

  • @property提供了一种定义类打算封装的信息的方法。 如果你使用@property声明一个对象/variables,那么这个对象/variables将被其他类导入其类。

  • 如果在头文件中使用@property声明对象,则必须在实现文件中使用@synthesize进行合成。 这使得对象KVC兼容 。 默认情况下,编译器将合成此对象的访问器方法

  • 存取方法是:setter和getter。

例如:.h

 @interface XYZClass : NSObject @property (nonatomic, retain) NSString *name; @end 

.M

 @implementation XYZClass @synthesize name; @end 

现在编译器会为名称合成访问器方法。

 XYZClass *obj=[[XYZClass alloc]init]; NSString *name1=[obj name]; // get 'name' [obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method 
  • @property的属性列表

    primefaces,nonatomic,保留,复制,只读,读写,分配,强,getter =方法,setter =方法,unsafe_unretained

  • primefaces是默认行为。 如果一个对象被声明为primefaces,那么它就变成了线程安全的。 线程安全的手段,一次只有该类的特定实例的一个线程可以控制该对象。

如果线程正在执行getter方法,则其他线程无法对该对象执行setter方法。 这很慢。

 @property NSString *name; //by default atomic` @property (atomic)NSString *name; // explicitly declared atomic` 
  • 非primefaces不是线程安全的。 您可以使用nonatomic属性来指定合成访问器直接设置或返回值,不保证如果从不同线程同时访问相同的值会发生什么情况。

出于这个原因,访问非primefaces性质比primefaces性质快。

 @property (nonatomic)NSString *name; 
  • 当属性是指向对象的指针时, retain是必需的。

setter方法将增加对象的保留数,以便它将占用autorelease池中的内存。

 @property (retain)NSString *name; 
  • 复制如果使用复制,则不能使用保留。 使用该类的副本实例将包含自己的副本。

即使设置了可变string并随后更改,实例也会捕获设置时的值。 将不会合成setter和getter方法。

 @property (copy) NSString *name; 

现在,

 NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"]; xyzObj.name = nameString; [nameString appendString:@"Pizza"]; 

名称将保持不受影响。

  • 只读如果您不想通过setter方法更改属性,则可以只读声明该属性。

编译器将生成一个getter,但不是一个setter。

 @property (readonly) NSString *name; 
  • readwrite是默认行为。 您不需要明确指定readwrite属性。

它只是只读的对面。

 @property (readwrite) NSString *name; 
  • assign会生成一个setter,直接赋值给实例variables,而不是复制或保留它。 对于像NSInteger和CGFloat这样的原始types,或者你不直接拥有的对象,比如代表,这是最好的select。

请记住,启用垃圾回收时,保留和分配基本上是可以互换的。

 @property (assign) NSInteger year; 
  • 是保留的替代品。

它带有ARC。

 @property (nonatomic, strong) AVPlayer *player; 
  • getter = method如果要为getter方法使用不同的名称,可以通过向属性添加属性来指定自定义名称。

在布尔属性(具有YES或NO值的属性)的情况下,getter方法通常以“is”

 @property (getter=isFinished) BOOL finished; 
  • setter = method如果要为setter方法使用不同的名称,可以通过向属性添加属性来指定自定义名称。

该方法应该以冒号结尾。

 @property(setter = boolBool:) BOOL finished; 
  • unsafe_unretained Cocoa和Cocoa Touch中有几个类还不支持弱引用,这意味着你不能声明弱属性或弱局部variables来跟踪它们。 这些类包括NSTextView,NSFont和NSColorSpace等。 如果您需要使用对这些类之一的弱引用,则必须使用不安全的引用。

不安全的引用类似于弱引用,因为它不保留其相关对象的活动状态,但是如果目标对象被释放,它将不会被设置为零

 @property (unsafe_unretained) NSObject *unsafeProperty; 

如果您需要指定多个属性,只需将它们包含为逗号分隔列表,如下所示:

 @property (readonly, getter=isFinished) BOOL finished; 

在阅读了很多文章后,我决定把所有的属性信息放在一起:

  1. primefaces//默认
  2. 非primefaces
  3. 强=保留/ /默认
  4. 弱= unsafe_unretained
  5. 保留
  6. 分配//默认
  7. unsafe_unretained
  8. 复制
  9. 只读
  10. 读写//默认

以下是可以find这些属性的详细文章的链接。

非常感谢所有在这里给出最佳答案的人!

iOS中的variables属性或修饰符

这里是来自文章的样本描述

  1. primefaces – primefaces意味着只有一个线程访问variables(静态types)。 primefaces是线程安全的。 – 但它的性能很慢-atomic是默认行为 – 在非垃圾收集环境(即使用retain / release / autorelease时)中的primefaces访问器将使用锁来确保另一个线程不会干扰正确的设置/获取的价值。 它实际上并不是一个关键字。

例如:

 @property (retain) NSString *name; @synthesize name; 
  1. 非primefaces -Nonatomic是指multithreading访问variables(dynamictypes)。 -Nonatomic是线程不安全的。 – 但它的性能很快–Nonatomic不是默认行为,我们需要在属性属性中添加非primefaces关键字。 当两个不同的进程(线程)同时访问相同的variables时,可能会导致意外的行为。

例:

 @property (nonatomic, retain) NSString *name; @synthesize name; 

说明:

假设有一个名为“name”的primefacesstring属性,并且如果从线程A调用[self setName:@“A”],则从线程B调用[self setName:@“B”],并调用[self name]线程C,那么在不同线程上的所有操作将被串行执行,这意味着如果一个线程执行setter或getter,则其他线程将等待。 这使属性“名称”可读/写安全,但如果另一个线程D同时调用[名称释放],则此操作可能会导致崩溃,因为此处不涉及setter / getter调用。 这意味着一个对象是读/写安全(ATOMIC),但不是线程安全的,因为另一个线程可以同时向对象发送任何types的消息。 开发者应该确保这些对象的线程安全。

如果属性“name”是非primefaces的,则上面的例子A,B,C和D中的所有线程将同时执行,产生任何不可预知的结果。 在primefaces的情况下,A,B或C中的任何一个将首先执行,但D仍然可以并行执行。

  1. 强大的 (iOS4 =保留) – 它说“把它放在堆里,直到我不再指向它” – 换句话说,“我是业主,你不能在与保留相同的目标之前释放它”。只有在需要保留对象的情况下才能使用强壮。 – 默认情况下,所有实例variables和局部variables都是强指针。 – 我们通常使用强UIViewControllers(UI项目的父母)-strong与ARC一起使用,它基本上帮助你,不必担心对象的保留计数。 ARC完成后会自动为您发布。使用关键字strong意味着您拥有该对象。

例:

 @property (strong, nonatomic) ViewController *viewController; @synthesize viewController; 
  1. (iOS4 = unsafe_unretained) – 它说“保持这个,只要别人强烈指向它” – 同样的事情分配,不保留或释放 – 一个“弱”的引用是你不保留的引用。 – 我们通常对IBOutlets(UIViewController的Childs)使用weak。这是可行的,因为子对象只要父对象有效就只需要存在。 – 弱引用是一个引用,它不保护被垃圾收集器收集的引用对象。 “弱者”本质上是一种不受重视的财产。 除了释放对象的时候,弱指针自动设置为零

例如:

 @property (weak, nonatomic) IBOutlet UIButton *myButton; @synthesize myButton; 

强和弱的解释, 感谢BJ荷马 :

想象一下,我们的目标是一只狗,而狗想逃跑(被释放)。 强壮的指针就像狗狗上的皮带。 只要你有狗的皮带,狗不会逃跑。 如果五个人把他们的皮带绑在一只狗身上(五个指向一个物体的强指针),那么在所有五个皮带脱离之前,狗不会跑掉。 另一方面,弱指针就像小孩子指着狗说:“看!一条狗!” 只要狗仍然在拴住,小孩子仍然可以看到狗,他们仍然指向它。 然而,只要所有的皮带都分离了,不pipe有多less小孩指着它,狗都会跑掉。 只要最后一个强指针(皮带)不再指向一个对象,对象将被释放,所有弱指针将被清零。 当我们使用弱? 如果你想避免保留周期(例如,父母保留孩子,孩子保留父母,所以永远不会被释放)。

  1. 保留 =强 – 保留,旧值被释放并被分配 – 保留指定新值应该被发送 – 在赋值时被保留并且旧的值被发送 – 释放 – 保留是一样的强。 苹果说,如果你写保留它会自动转换/工作像只有强。 像“alloc”这样的方法包含一个隐式的“保留”

例:

 @property (nonatomic, retain) NSString *name; @synthesize name; 
  1. assign -assign是默认值,只是执行一个variables赋值-assign是一个属性属性,告诉编译器如何合成属性的setter实现-I将使用C语言属性的赋值,而弱赋值给Objective-C对象。

例:

 @property (nonatomic, assign) NSString *address; @synthesize address; 
  1. unsafe_unretained

    -unsafe_unretained是一个所有权限定符,告诉ARC如何插入保留/释放调用-unsafe_unretained是分配的ARC版本。

例:

 @property (nonatomic, unsafe_unretained) NSString *nickName; @synthesize nickName; 
  1. 当对象是可变的时, copy -copy是必需的。 -copy指定应该发送的新值 – 赋值时拷贝和发送的旧值 – 释放。 -copy就像保留返回一个对象,你必须明确释放(例如,在dealloc)在非垃圾收集环境。 如果你使用复制,那么你仍然需要在dealloc中释放它。 – 如果此时需要对象的值,则不要使用此值来反映对象的其他所有者所做的任何更改。 您将需要释放对象,因为您保留副本。

例:

 @property (nonatomic, copy) NSArray *myArray; @synthesize myArray; 

primefaces属性一次只能被一个线程访问。 这是线程安全的 。 默认是primefaces。请注意,没有关键字primefaces

非primefaces意味着多个线程可以访问该项目。它是线程不安全的

所以在使用atomic时应该非常小心,因为它会影响代码的性能