gpt4 book ai didi

ios - Objective-C 函数参数和静态变量同名

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

我在 objective-c 中对静态变量的命名重写有一些疑问。

我的 .h 文件是:

    #import <Foundation/Foundation.h>


@interface FetchClass : NSObject

+ (void)initWithNSManagedObjectContext:(NSManagedObjectContext *) managedObjectContext;
@end

我的 .m 文件是:

static NSManagedObjectContext * managedObjectContext;

@implementation FetchClass

+ (void)initWithNSManagedObjectContext: (NSManagedObjectContext *) managedObjectContext{
FetchClass.managedObjectContext = managedObjectContext;
}

但是,我得到了错误

“在 FetchTasks 类型的对象上找不到属性 managedObjectContext”

所以,问题是,函数参数 managedObjectContext 当然会覆盖同名的静态变量。这就是为什么我必须通过 Class.staticVariableName 获取静态变量。但是这次我得到了上面提到的错误。

但是,如果我将静态变量名称更改为其他名称,例如:

static NSManagedObjectContext * managedObjectContextOtherName;

@implementation FetchClass

+ (void)initWithNSManagedObjectContext: (NSManagedObjectContext *) managedObjectContext{
managedObjectContextOtherName = managedObjectContext;
}

它工作得很好。我的问题是,如果它们具有相同的名称,如何使用这些变量(静态变量和函数参数变量)?

最佳答案

静态变量,如您的managedObjectContext,是最接近 Objective-C 提供的类变量的东西但是 这不是一回事,这就是为什么你在做你正在尝试的事情时会出错——你不能通过用类名限定它来解析你的引用。

在 (Objective-)C 中,在任何函数/方法之外声明的静态变量具有全局生命周期文件作用域 - 即变量始终存在但仅在以下位置可见在与其声明相同的源文件中。在引用静态时,没有可用于解决歧义/隐藏的“文件范围”限定符,内部范围内具有相同名称的任何变量都将隐藏静态。

在您的情况下,您可以使用:

+ (void)initWithNSManagedObjectContext:(NSManagedObjectContext *)_managedObjectContext
{
managedObjectContext = _managedObjectContext;
}

(并且无需更改接口(interface)中的 initWithNSManagedObjectContext: 声明 - 参数名称不需要匹配 - 因此如果您的“公共(public)”声明不需要名称中的 _你不希望它。)

关于ios - Objective-C 函数参数和静态变量同名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20819838/

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