Iphone 我是否希望使用除“属性”以外的任何@property属性;保留;及;“非原子的”;对于UI变量?

Iphone 我是否希望使用除“属性”以外的任何@property属性;保留;及;“非原子的”;对于UI变量?,iphone,objective-c,cocoa-touch,ipad,Iphone,Objective C,Cocoa Touch,Ipad,我正在潜心研究iOS开发,我发现对于我的每个UI控件,我总是盲目地声明它们的@property,就像这样,因为在我开始学习时阅读的一些教程中就是这样做的 @property (retain, nonatomic) IBOutlet UILabel *lblStatus; 我仍在熟悉这些属性类型及其含义,但我发现这两个属性允许我实现我的目标。除了“retain”和“nonatomic”之外,我还想为UI变量使用任何@property属性吗 提前感谢您的帮助 答案是否定的。这背后的原因是我们使用非

我正在潜心研究iOS开发,我发现对于我的每个UI控件,我总是盲目地声明它们的@property,就像这样,因为在我开始学习时阅读的一些教程中就是这样做的

@property (retain, nonatomic) IBOutlet UILabel *lblStatus;
我仍在熟悉这些属性类型及其含义,但我发现这两个属性允许我实现我的目标。除了“retain”和“nonatomic”之外,我还想为UI变量使用任何@property属性吗


提前感谢您的帮助

答案是否定的。这背后的原因是我们使用非原子和保留的原因

从“nib文件中的对象创建时保留计数为1,然后自动删除。当UIKit重建对象层次结构时,它使用setValue:forKey:(使用可用的setter方法)重新建立对象之间的连接,如果没有可用的setter方法,则默认情况下保留对象。这意味着(假设您遵循“Outlets”中所示的模式),您拥有Outlets的任何对象都将保持有效。”

因此,我们提供此setter只是为了与默认行为匹配。
是的,可以用其他方式声明setter,但至少我没有找到这样做的理由。如果我们使用assign而不是retain,则无法保证对象将保持有效。内存管理在iP中已经至关重要hone,显然,我不想通过忽略约定而使其变得更加重要。

--edit
答案否仅适用于UI变量,即IBOutlets。不要混淆。其他属性在其他情况下是必要的,如其他答案中所述。

注意:我在问题中遗漏了对UI变量的引用,因此这是wer是一个更一般性的讨论

,您肯定需要使用这两个属性之外的其他属性,尽管这是最常见的组合

  • 复制
    -在不希望后续数据更改被“拾取”的情况下使用此选项通过您的类。换句话说,当您希望在数据传入后对其进行完全控制时。有时这是可取的,有时则不是。像
    NSString
    UIColor
    这样的类通常通过具有
    copy
    属性的属性使用。提供了更多的背景信息
  • assign
    -您可以将其与
    int
    等基本类型一起使用。您不能保留或复制
    int
    float
    ,因为它们不是对象,所以您必须使用assign。(此外,您不必也不能在
    dealloc
    方法中释放这些变量。)对于C结构也是如此,Objective-C retain count系统不包括这些结构
  • assign
    特殊情况-有时您甚至会对对象使用
    assign
    ,因为您希望避免。例如,查看
    UITableView
    的标题。您会注意到
    委托
    属性声明如下:
    @属性(非原子,assign)id delegate
    。应该始终使用
    assign
    声明委托属性,这同样适用于某些其他情况,尽管您不太可能很快遇到它们
  • 非原子的
    -这告诉编译器该属性仅用于从一个线程访问,因此它可以省略一些可能会降低程序速度的代码(可能会大大降低)因此,这里的规则是:如果属性将或可能从多个线程访问,则不应将其声明为
    非原子的
    原子的
    )是默认设置。但是,请注意,使属性原子化并不足以使代码线程安全。这是另一个更棘手的主题
注意:这个答案通常与UI项更相关

是的,在其他情况下,您可能希望使用“assign”宏而不是“retain”(assign目前是默认值,但如果您没有明确指定它,则在编译时会收到警告)

苹果在他们的一篇教程中给出了一个很好的例子:


它们仅“分配”以避免循环保留。(每个视图保留另一个视图,因此它们不能被释放)。

(保留)通常用于实例变量,assign将用于委托和基本数据类型,如bool,int

问题是关于UI变量的,这是关于IBOutlets的。不用于其他变量。啊,谢谢,你是对的。我想我会把它留在这里,作为对Pier Olivier答案的补充。当然,你应该按照你给出的那样保留它一个很好的解释。在很多情况下,您需要其他属性,但在这种情况下,问题是专门针对IBOutlets的。为什么要保持较低的保留计数?保留计数并不重要。重要的是保留和释放是否平衡。(但很好地参考了UITableCell场景。例如,我可以想象使用代理对象时的类似场景。)他谈到了UI控件。UI控件可以在没有界面生成器AFAIK的情况下构建,这使得我的论点在高级UITableViewCell示例中仍然有效。对于保留计数来说,在过去,使用较低的值使我更容易知道泄漏时发生了什么。保持较低的值也有助于避免泄漏。存在属性声明中IBOutlet的属性表示它是从nib加载的。是的,毫无疑问,我们可以在没有IB的情况下构建任何东西。但是nib的内存管理不同于其他情况。从nib加载时应该使用retain。