gpt4 book ai didi

objective-c - 名为 "a"的对象和名为 "_a"的对象之间是否存在链接?

转载 作者:行者123 更新时间:2023-11-28 19:23:33 24 4
gpt4 key购买 nike

我是 iOS 新手,所以慢慢来。当我在我的 .h View Controller 中声明一个名为“_a”的对象并声明一个属性“a”时,当我在 .m 文件中进行合成时

@synthesize a=_a;

当我修改那个对象时我必须使用“a”或“_a”吗? (在我的例子中,“a”是一个 UINavigationController)。

在另一个问题中,我的编译器是否会自动绘制从声明为“ob”的对象到“_ob”声明的连接?

再次,对于糟糕的解释感到抱歉,但这种环境不是我习惯的。

最佳答案

这样声明的对象:

@interface Example : NSObject {
NSObject *_a;
}
@property (retain) NSObject *a;
@end

然后这样实现:

#import "Example.h"

@implementation Example
@synthesize a = _a;
@end

Example 对象中创建一个名为 _a 的 ivar 和两个访问器方法。访问器方法具有以下签名:

- (NSObject *)a;
- (void)setA:(NSObject *)theA;

方法 a 返回 _a ivar 中的对象。方法setA释放_a中存储的对象(如果不为nil),将参数赋值给_a,并发送参数anretain 消息。

这些方法也可以通过点符号访问:

Example *e = [[Example alloc] init];
// These two are equivalent.
e.a = anotherNSObject;
[e setA:anotherNSObject];
// These two are equivalent.
anotherNSObject = e.a;
anotherNSObject = [e a];

直接访问_a会绕过访问器方法,可能导致内存泄漏等问题。例如,如果 _a 持有一个对象的唯一引用,并且一个新的对象引用被分配给 _a,旧对象将成为泄漏对象。

直接回答你的两个问题:

您可以使用a_a。在大多数情况下,在读取声明 asetA(或 a 点号)设置_a的值时。使用 Example 对象的对象应该使用访问器方法(带或不带点符号)。

编译器不会自动在 ob_ob 声明之间建立连接。在此示例中,@synthesize a = _a; 语句与可选的 = _a 建立连接。 ivar 可以有任何名称。 @synthesize a = george; 也是有效的。如果没有 = _a 部分,编译器将创建一个名为 a 的 ivar 和两个访问器方法。

进一步注意:您可以在接口(interface)中省略 _a 的声明,这将 _a ivar 的范围限制为仅实现 Example 对象。将可选的 = _a 添加到 @synthesize 语句将生成与接口(interface)中声明的属性相同类型的 as ivar。

关于objective-c - 名为 "a"的对象和名为 "_a"的对象之间是否存在链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6437517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com