Objective-C变量/对象声明

时间:2013-01-01 02:35:28

标签: iphone objective-c variables declaration

我在Objective-C中有一些关于变量/对象声明的问题,我希望能更好地理解一些事情。

  1. 我知道给一个变量@property声明允许你从其他类访问它,如果你不打算在它自己的类之外使用它,这有什么用吗?

  2. 我经常在示例代码中看到变量和对象仅使用@property声明,而不是直接在@interface声明。为什么呢?

  3. 我在使用@synthesize时也看到了人,做var = _var;之类的事情。怎么来的?

  4. 在引用对象和变量时,是否有任何理由,例如self.var.而不是var.

3 个答案:

答案 0 :(得分:3)

  1. @property并合成,即使是私下使用,也可以预先构建 吸气剂和二传手。这就是我使用它们的原因。

  2. 在最近的Xcode中,你得到了一个为你提供的合成,所以你 @synthesize可以单独处理@property。

  3. 下划线别名允许您将堆栈变量命名为相同 含糊不清,例如......

    // say my class contains a property called foo, alias _foo.
    - (void)initWithFoo:(id)foo {
        self = [self init];
        if (self) {
            _foo = foo;  // assign the param to the instance var
        }
        return self;
    }
    
  4. 在init和之外使用getter和setter是一个好习惯 dealloc的。吸气者和制定者“掐断”访问 属性到您可能想要添加行为的单个位置。 例如,通常的做法是将getter用作惰性 初始化程序......

    // this code assumes ARC, otherwise for retained properties without arc, you'll need to add release and retain code here and if you replace the default setter
    - (SomeType *)bar {
        if (!_bar) {
            _bar = [[SomeType alloc] init];
        }
        return _bar;
     }
    

答案 1 :(得分:2)

  1. 您还可以访问未声明为属性的变量。财产只是一种捷径。一种告诉编译器自动为该变量创建getter和setter(访问器)方法的方法。您有时在括号中看到的标志是更改访问器方法的实际实现的其他选项。
  2. 因为在这种情况下,实例变量将在编译时自动添加到您的类中。除了额外的下划线前缀(_var)之外,该变量的名称将与您的属性相同。
  3. 这允许您更改自动生成的实例变量的名称。从等号左边是财产;实例变量位于右侧。您也可以自己声明实例变量,如果它与属性的名称不同,则必须以这种方式进行分配。
  4. 使用self.var将使用访问者方法(无论是否自动添加,或者您自己实现)。例如,如果你想懒惰地加载一个对象,你可以自己实现一个getter来检查对象是否已经存在,如果没有则创建它,然后返回它:

    // Assuming you defined  @property (nonatomic) MyClass *var;  in the header
    - (MyClass *)var {
        if (!_var) {
            _var = [[MyClass alloc] init];
        }
        return _var;
    }
    

    现在您可以使用点语法访问它:

    [self.var doSomething];
    

    这将调用上面定义的getter。如果变量是nil(尚未使用),则首先对其进行初始化。如果您刚刚使用了实例变量...

    [_var doSomething];
    

    ...你会得到不同的结果。如果_varnil,则会忽略该消息(无错误,崩溃)。这是因为您直接访问变量,而不是通过访问器方法。当然,如果您确定该对象将被初始化,或者在nil处理该情况,那么您可以直接使用它。

答案 2 :(得分:1)

  1. 当您使用合成 * @property时,您可以避免编写“样板”代码,例如复制或锁定以使访问原子化。随着ARC的推出,这一功能的重要性大大降低。
  2. 无需在最新的Xcode中编写@synthesize,您可以使用很少或不需要额外编码的属性。由于属性比变量更具“未来证明”,因为您可以在getter中的setter和计算中执行验证,因此您几乎没有理由使用“普通”变量。
  3. 在最新的Xcode中不需要使用@synthesize。如果您看到很多@synthesize,那么您可能正在阅读“旧代码”(超过6个月)。
  4. 不,没有理由对变量这样做。据称为了清楚起见,有些商店要求程序员这样做。我不会对此发表评论,因为这是一个偏好问题。如果您决定这样做,则应该在整个代码库中始终如一地执行此操作。
    * 显式通过@synthesize或隐式使用最新的Xcode。