gpt4 book ai didi

Objective-C 实例变量访问器方法

转载 作者:搜寻专家 更新时间:2023-10-30 20:20:48 25 4
gpt4 key购买 nike

我正在尝试更深入地了解 Objective-C 编程语言。

现在我有一个关于在设置值时调用 [self] 的问题。

Apple 文档说“如果不使用 self.,则直接访问实例变量。(...)”

假设我有一个狗对象,它有一个实例变量 NSString *name

我在不使用 [self] 关键字的情况下为该实例变量创建了一个 setter:

(void)setName:(NSString *)_name
{
name = _name;
}

当我使用 [self] 关键字创建一个 setter 时,它看起来像这样:

(void)setName:(NSString *)_name
{
self->name = _name;
}

在主要方法中,我创建了一个新的狗对象并设置并返回它的名称值:

Dog *myDog = [[Dog alloc] init];

myDog.name = @"Yoda";

NSLog(@"name of the dog: %@", myDog.name);

在这两种情况下,我都得到了 Yoda 的返回值。但是,从技术上讲,使用 [self] 和不使用 [self] 调用实例变量之间的区别在哪里?是不是我调用同一个变量(内存)只是没有使用setter方法?

最佳答案

self 是对对象本身的隐式引用,通常只有当参数和实例变量同名时才真正需要指定它,例如,如果您有:

(void)setName:(NSString *)name
{
self->name = name; // self used here to differentiate between param and ivar
}

但是,您需要注意命名约定和方法的实现:

  1. 通常使用前导下划线作为命名实例变量的约定,而不是传递给方法的参数。
  2. 为了设置 NSString * 对象,通常您需要保留它以获得对象的所有权并避免它被释放(这将在您稍后访问它时导致异常)。

因此您的 setName 方法应该看起来更像这样:

// _name is the instance variable
- (void)setName:(NSString *)name
{
[name retain];
[_name release];
_name = name;
}

仅当您使用 MRR 而不是 ARC 时才会出现这种情况,但您没有指定,因此我假设您使用的是 MRR。

关于Objective-C 实例变量访问器方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11738301/

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