【问题标题】:Why should we declare variables for @property为什么要为@property 声明变量
【发布时间】:2011-01-16 17:18:59
【问题描述】:

我是Objective的新手。当我阅读许多教程时,@property 有一个类型的变量,同样的变量也在 @inferface 中声明。需要这个吗?

例子

@interface MyInterface : NSObject
{
   NSInteger myVaribale;
}
@property(retain) NSInteger myVariable; 

这里 myVariable 在两个地方都声明了。

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    从 iOS 4 开始,你可以写了

    @interface MyInterface : NSObject {
    }
    
    @property(assign) NSInteger myVariable; 
    
    @implementation MyInterface
    @synthesize myVariable;
    @end
    

    意思是你可以在你的接口声明中省略 NSInteger myVaribale,只要你在 .m 中合成它(合成将创建 setter、getter 和实例变量)

    一个缺点是您不会在 Xcode 的调试器中看到 myVariable 的值。

    【讨论】:

    • 我不知道那个。这很整洁。可惜它没有显示在调试器上。
    【解决方案2】:

    请注意,如果您想将属性声明为 ivar 的 不可变 类型,则在 @property 语句中重新声明 ivar 的类型也很有用,例如:

    @interface MyClass : NSObject
    {
        NSMutableArray *myArray;
    }
    
    @property (retain) NSArray *myArray;
    

    在这种情况下,ivar 实际上存储为NSMutableArray,因此可以在对象的生命周期内对其进行更改。

    但这是一个内部细节,如果您不想“宣传”它是可变的(可更改的),您可以将属性的类型设为不可变类型——在本例中为 NSArray

    虽然这实际上不会阻止其他代码使用返回的数组作为可变数组,但这是一个很好的约定,并通知其他代码它不应该以这种方式对待它。

    【讨论】:

      【解决方案3】:

      这不是不便,而是objc的一个基本概念:一个类可以有成员变量。在 OOP 中,您通常为外部可用的成员变量定义 getter 和 setter。在 Objective-c 中,鼓励您随时定义 getter/setter(如果它们应该是私有的,请将它们的声明放入私有接口中)。为了简化这个任务,objective-c 使用了不超过缩写的属性。此外,还有一些像键值编码和观察这样的东西,它们是由属性启用的,但基本上,它们只是 getter 和 setter 的缩写。

      结论:在@interface 内部声明成员,外部方法包括getter/setter(属性)。

      【讨论】:

      • 这仅适用于 32 位桌面运行时。其他的允许@properties 也可以合成存储。
      猜你喜欢
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多