目标C:我需要一些关于属性和ivars的建议

时间:2015-09-04 19:13:39

标签: objective-c properties ivar

我在stackoverflow和许多其他网站上查找了我当前的问题,但我很有点困惑,说实话。我应该只在另一个类需要访问它时才使用属性,而当它仅用于我的私有类时是否应该使用iv?这是我到目前为止所得到的,虽然我确实听到了关于何时使用ivars和属性的其他一些事情。我只是想保持我的代码干净,更现代。任何澄清将不胜感激。

3 个答案:

答案 0 :(得分:3)

这是一个非常基于意见的主题。因此,我试图坚持无争议的事实和建议:

  • 永远不要从课堂外访问ivars。公共访问始终通过属性及其访问者或其他方法完成。现在标题永远不应该包含ivar声明。
  • 内部使用ivars是可能的,并非罕见。 ARC使对象类型变得容易,因为所有权是自动处理的。
  • 使用属性可为NSStringNSArray等人提供正确的所有权处理。 (copy)。
  • 此外,在某些情况下,他们可以帮助提高线程安全性(atomic)。
  • 在内部使用属性可以使KVO合规性或其他副作用更容易实现。
  • 使用私有属性是公开IBOutlets的标准模式。
  • 可以在运行时查询属性。但这很少需要。
  • 私有属性存在污染类的方法命名空间的问题。可能会发生无意的覆盖。

在实施过程中是否使用ivars的实际决定取决于个人喜好。它受到代码风格中许多微妙细节的影响。

答案 1 :(得分:0)

在我看来 - 如果你没有覆盖吸气剂和设定器,你应该只使用由ivar支持的属性。

您应该在公共界面中声明它们以使它们公开,并在私人界面中声明它们,使它们成为私有。

这有很多好处,有些是:

  1. 在getter中执行延迟实例化
  2. 在setter中进行验证
  3. 将属性只读公开并私下读写
  4. 在您的课程中,您应该几乎始终通过getter / setter访问您的属性,除非:

    1. 您希望避免在这些方法中实现的行为(延迟实例化,验证)
    2. 您在初始化程序中
    3. 你在getter / setter
    4. 以下是一些如何解释以下几点的例子:

      @interface SomeObject : NSObject
      @property (strong, nonatomic) NSMutableArray * objects;
      @property (readonly, nonatomic, getter=isActive) BOOL active; // Public read-only 
      @end
      
      @interface SomeObject()
      @property (readwrite, nonatomic, getter=isActive) BOOL active; // Can be updated internally
      @property (nonatomic, getter=isVisible) BOOL visible;
      @end
      
      @implementation SomeObject
      
      - (NSMutableArray)objects {
         if (!_objects) {
            _objects = [NSMutableArray array]; // Lazy instantiate when first accessed
         }
         return _objects;
      }
      
      - (BOOL)isActive {
         return _isActive && self.isVisible; // Cannot be active if not visible
      }
      
      - (BOOL)setActive:(BOOL)active {
         self.visible = active; // Keep visibility same as active
         _active = active;
      }
      
      -(BOO)setVisible:(BOOL)visible {
         _visible = visible;
         // perform animation or something else...
      }
      
      @end
      

      使用ivars无法实现任何目标。

答案 2 :(得分:-2)

您应该在类的内部和外部使用声明的属性。大多数开发人员说你应该只在初始化器中的属性后面设置ivar。 (在这种情况下,我不同意并使用制定者和吸气剂,但我是少数人。)