1

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

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

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

  3. 我也看到人家在使用的时候@synthesize,做点什么之类的var = _var;。怎么会?

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

4

3 回答 3

3
  1. @property 和 synthesize,即使是私下使用,也会为您提供预构建的 getter 和 setter。这就是我使用它们的原因。

  2. 在最近的 Xcode 中,您会得到一个为您提供的合成器,因此您可以将 @property 单独视为与 @synthesize 的一对。

  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 和 dealloc 之外使用 getter 和 setter 是一种很好的做法。getter 和 setter 将对属性的访问“掐断”到您可能想要添加行为的单个位置。例如,一种常见的做法是使用 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;
     }
    
于 2013-01-01T02:52:17.023 回答
2
  1. 您还可以访问未声明为属性的变量。属性只是一个捷径。一种告诉编译器自动为该变量创建 getter 和 setter(访问器)方法的方法。您有时在括号中看到的标志是更改访问器方法的实际实现的附加选项。
  2. 因为在这种情况下,实例变量将在编译时自动添加到您的类中。该变量的名称将与您的属性相同,除了一个额外的下划线前缀 ( _var)。
  3. 这允许您更改自动生成的实例变量的名称。等号左边是属性;实例变量在右侧。您还可以自己声明实例变量,如果它与属性的名称不同,则必须以这种方式分配它。
  4. Usingself.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,那么你可以直接使用它。

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