0

每隔几个月我就会尝试重新学习 Cocoa,因为除了作为一种爱好之外,我对 iOS 编程没有任何实际用途。我将回顾基础知识并查看点符号的不同之处;例如,查看 API 是如何更新为默认执行常见任务的。

有很多文档,这很好,但当您想快速启动和运行时,这也可能是一件坏事。虽然它正在慢慢恢复,但我认为自己是该主题的重生新手,因此不胜感激。


头文件:

@interface FooClass : NSObject
{
@private
    double foo;
}
@property (nonatomic) double foo;
@end

实现文件:

@implementation FooClass
@synthesize foo = _foo;
- (void) doSomething
{

}
@end

在 doSomething 实现中,是否有可能拥有bar一个指向类的指针的局部变量(例如 ),foo以便何时更新barget/set foo(本地别名)?我尝试了以下变化:

double bar = *self.foo;
double *bar = self.foo;
double *bar = *self.foo;
double *bar = &self.foo;

bar=5;

如果是这样,正确的语法是什么?另外,有些东西告诉我这是一个坏主意,那为什么会这样呢?


编辑:看起来经过更多搜索后,我发现了类似的东西:objective-c: double pointers to property not allowed? 现在,我将尝试理解它。

4

1 回答 1

2

您的示例包含一个错误:

@interface FooClass : NSObject
{
@private
    double foo;
}
@property (nonatomic) double foo;
@end

这声明了一个属性foo。它还声明了一个 ivar(实例变量)foo,人们可能会认为它是与同名属性关联的 ivar。

@implementation FooClass
@synthesize foo = _foo;
@end

不幸的是,@synthesize声明说“合成 foo 属性并创建一个调用_foo它的 ivar”。因此,您现在有两个 ivar,foo(您在{}中的之间创建@interface)和_foo,您刚刚将其合成为与foo属性关联的 ivar。有 ivar 漂浮在外面是不好的foo,它是显式声明的,导致读者假设它会与同名的属性相关联,但事实并非如此,因为_foo是。

很久以前,您会被建议修复您的显式 ivar 声明,例如

@interface FooClass : NSObject
{
@private
    double _foo;
}
@property (nonatomic) double foo;
@end

但现在更好的是,建议您完全省略属性的显式 ivar 定义,并让@synthesize语句为您创建该 ivar,从而消除我们上面描述的问题的任何可能性,例如,简单地:

@interface FooClass : NSObject
@property (nonatomic) double foo;
@end

此外,该@synthesize语句现在是可选的,如果省略,它将完全按照您的建议执行@synthesize foo = _foo;

在回答您关于使用变量访问您的属性的问题时,这就是_foo实例变量。为什么需要另一个变量?此外,您通常应该使用 getter。

通常建议不要使用 ivar 来设置属性,而是使用属性的访问器。该建议也适用于通过局部变量更改属性值的任何尝试。您绝对应该使用 ivar 的唯一一次是在您的初始化程序和 dealloc 方法中。

顺便说一句,对“使用访问器方法设置属性值”的引用是对您的主要问题的迂回回答(至少如果您曾经试图使用该局部变量来更改属性的值)。您应该只使用对象设置器访问器来更改属性的值。setter 做了重要的事情,绕过它是不明智的。实际上,要回答您的最后一个问题,就是指导您如何以一种不会产生编译器警告的方式做错事,因此我犹豫是否要去那里。

一些相关的参考资料包括:

于 2012-12-18T01:53:09.330 回答