2012-02-06 69 views
20

这是一个两部分的问题,希望我可以了解更多关于该主题。iOS财产声明澄清

1)在我看来,你必须在objective c声明属性一个二班流行选项。一种是将属性添加到标题的类体中,例如。

@interface MyClass : NSObject { 
    NSArray *myArray; 
} 

或者你可以在@interface后身体和@end声明像这样前加入。

@interface MyClass : NSObject { 
    // 
} 

@property (nonatomic, retain) NSArray *myArray; 

是什么这两个“风格”,当你选择一个比其他的区别?

2)在@property之后,您会找到诸如(nonatomic, retain)之类的选项。什么是和为什么/当你使用不同的选项?

回答

47

下面是Xcode中识别的唯一属性修改器:

  • nonatomic(对物业不强制线程安全,主要用于使用时只有一个线程应在整个程序中使用)
  • atomic(强制执行的财产线程安全,主要用于当多个线程将在整个程序中使用)(默认)
  • retain/strong(自动保存/上设置的版本价值,确保值不会意外取消分配)(默认值,如果ARC和对象类型)
  • readonly(不能设置属性)
  • readwrite(既可以set和get属性)(默认)
  • assign/unsafe_unretained(无存储器管理应以该属性来完成,它是通过将值的人手动处理)(默认值如果不是ARC或对象类型)
  • copy(份数设置它之前的对象,在由于外部因素(字符串,数组等),值集不能改变的情况。
  • weak(自动归零应的对象被解除分配的参考,并且不保留传递的值)
  • getter=method(将用于获取该属性的值的选择器)
  • setter= method(设定中使用的选择器用于设置此属性的值)
+3

这个答案只有问题的第2部分。 Simon的答案讨论第1部分。 – 2013-06-11 17:05:09

+0

@MarkAmery当然 - 我觉得第1部分是非常基本的,其他答案在我回答时已经涵盖了它。无需在此添加重复信息。 # – 2013-06-11 17:21:38

+1

#2完全不正确。 'atomic'属性*不*确保线程安全;而是确保原子性。如果线程A和线程B都在写入,'atomic'确保结果将是一个整体值,这意味着任何一个或另一个。哪一个是未定义的。编写线程安全的代码并不像使用'atomic'属性那么简单。请参阅线程编程指南的“同步”一节:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i -CH8-SW1 – 2013-07-20 10:46:41

0

第一个将是私人声明,如果您没有定义第二个,那么其他类将无法访问它。其次,在.m模块中与@synthesize一起使用,编译器为您创建setter/getter。你仍然可以用这个定义你自己的getter或setter。在这种情况下,@property中定义的所有iVars都可以被其他类访问。​​保留/释放操作是自动完成的。 您应该阅读Apple文档以获取更多详细信息。 请检查: What's the difference between the atomic and nonatomic attributes?

28

1)@property是定义getter-和setter-methods的一种特殊方法,或者我们称之为Objective-C中的访问器。你的第一个片段只是声明一个你必须自己声明和写入访问器的数组。例如setMyArray:myArray
使用@property将声明您的访问器,相当于自己声明setMyArray:myArray。自Objective-C 2.0开始,声明访问器是首选方法。请注意,您仍然必须自己声明属性(您的情况myArray)。

2)您首先需要了解@synthesize。记住@property声明你的属性的访问器,@synthesize会执行它们。当你在@interface中使用@property时,你最可能在@implementation中写一个@synthesize。使用@synthesize相当于执行setMyArray:myArray
属性(nonatomic, retain)告诉编译器等内存管理应该如何工作,以及如何实现这些方法。请注意,您从未真正看到这些访问器,但请放心,它们已存在并准备好供您使用。

要阅读有关该主题的更多信息,我建议阅读以下Tutorial的第9部分属性或购买涵盖Objective-C简介的Book

你也应该熟悉至少以下属性:

  • 访问
    • 选择readwrite(默认)或readonly。如果设置了readonly,则只有getter方法可用。
  • 设置器内存管理
    • assign(默认),简单地分配新值。你最可能只用原始数据类型。
    • retain,释放旧值并保留新值。如果使用垃圾回收器,则retain相当于assign。为什么?旧值的手动发布将由垃圾收集器完成。
    • copy将复制新值并释放旧值。这通常用于字符串。
  • 穿线
    • atomic(默认)将确保setter方法是原子的。这意味着只有一个线程可以立即访问setter。
    • nonatomic,当你不使用线程时使用它。

This post给你一个很好的介绍内存管理和assignretaincopy

+0

@Jackson我是否可以请你接受我的回答?如果你不能接受,请让我知道我能做些什么来使我的回答更好。我非常感谢我的声誉,谢谢! – Simon 2012-02-08 08:47:59

+2

嗨,我诚恳地认为'理查德J.罗斯三世'对于像我这样的非读者有一个更简洁的答案。然而,我确实把你当作+1,因为你显然会在你的答案中付出很多努力。另外,我看到*商业概念*在问为什么我没有接受你的答案,但我相信这是一个“推迟”*要求某人接受你的答案。我相信每个人都有不同的*关于这个话题。无论如何,这是我的双重意义。 – Jacksonkr 2012-02-18 22:57:24

2

属性基本上是访问器方法。他们定义变量的范围。 上面给出的第一种情况是,变量不能在其他类中访问,而通过在第二种情况下声明属性,变量也可以在其他类中访问。 另外,它们对内存管理很有用。

+0

一个实例变量可以通过声明它们为'@ public'而被其他类访问。 – newacct 2014-04-05 10:55:06

0

属性基本上是访问器方法。他们定义变量的范围。默认访问说明的变量是保护和属性设置其说明从保护公开