【问题标题】:Understanding properties by writing own setter method通过编写自己的 setter 方法来理解属性
【发布时间】:2011-06-09 16:47:04
【问题描述】:

所以我在 OOAD、属性、self 关键字等方面遇到了问题。我只想创建一个具有 UITableView 的简单测试项目。我有一个

的 ivar
NSArray *tableData;

我将如何为此编写一个 setter 和 getter 方法?我认为我的二传手看起来像:

- (void)setTableData:(NSArray *)array {
    [tableData autorelease];
    tableData = [array retain];
}

然后当我尝试在我的 viewDidLoad 中使用这个方法时,我意识到我需要创建我的 ViewController 的一个实例。当我在书籍中为 NSArray 创建属性时,这似乎是不应该做的,然后在 viewDidLoad 中只做一个

NSArray *array = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", @"4", nil];
    self.tableData = array;
[array release];

我只是想了解幕后发生的事情,尝试了解 OOAD 原则、ivars、属性、自我等。提前致谢。

【问题讨论】:

  • 您是如何尝试在viewDidLoad 中使用setTableData: 方法的?

标签: iphone objective-c properties


【解决方案1】:

我相信您已经知道使用 @synthesize 将为您创建 setter/getter 方法,但最好了解“幕后”发生的事情以理解这些概念。

就 setter 方法而言,您可能最好使用以下方法:

- (void)setTableData:(NSArray *)array {
    if (tableData != array) {
        [tableData release];
        tableData = [array retain];
    }
}

这基本上检查以确保新数组实际上与当前数组不同。如果是,则释放旧实例并设置新实例。

对于 getter 方法,只需使用:

- (NSArray *)tableData (
    return tableData;
}

这可以通过调用self.tableData 来访问。当然,设置数组就像你所做的一样,使用self.tableData = array;

我希望这会有所帮助。如果您需要更多信息,请直接说出来,我很乐意尝试进一步解释

【讨论】:

  • 是的,这有帮助,除了使用它的部分。当我尝试做 self.tableData 时,我得到了 Property tableData not found 的错误。我想这就是我困惑的原因,然后我认为我必须创建一个属性才能使用 self 关键字。
  • 哦,我明白了。您需要在头文件中设置一个属性。你已经有NSArray *tableData delared,我敢肯定。但是您还必须在头文件的底部声明@property (nonatomic, retain) NSArray *tableData,您将在其中声明方法。然后你可以使用你的 setter 和 getter 方法
  • 啊啊啊啊啊啊。是的!我一直认为一个属性立即意味着合成,但它只是创建 getter/setter 方法的合成。那么,如果 ivar 是属性,而不是属性,那么有什么区别呢?
  • Aa 属性允许您为 ivar 分配值,以及让您指定它的行为方式。例如,您可以拥有@property (readwrite)(readonly)(nonatomic, assign)(retain) 等。您可以更好地控制ivar 的存储和检索方式,尤其是在使用setter/getter 方法时。但是,常规 ivar 具有标准的、不可修改的行为。因此,所见即所得。 @property 声明还允许您从代码外部设置和获取变量(假设您有一个插座),这非常好,尤其是在 iOS 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2016-11-30
  • 1970-01-01
相关资源
最近更新 更多