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

Ios Objective-C函数参数和静态变量同名,ios,objective-c,Ios,Objective C,我对objective-c中静态变量的命名重写有一些疑问 我的.h文件是: #import <Foundation/Foundation.h> @interface FetchClass : NSObject + (void)initWithNSManagedObjectContext:(NSManagedObjectContext *) managedObjectContext; @end 然而,我得到了错误 “在FetchTasks类型的对象上找不到属性manag

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

我的.h文件是:

    #import <Foundation/Foundation.h>


@interface FetchClass : NSObject

+ (void)initWithNSManagedObjectContext:(NSManagedObjectContext *) managedObjectContext;
@end
然而,我得到了错误

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

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

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

static NSManagedObjectContext * managedObjectContextOtherName;

@implementation FetchClass 

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

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

方法参数和实例变量应具有不同的名称。当它们相同时,编译器应该警告您它使用了method变量

静态变量,如您的
managedObjectContext
,与Objective-C提供的类变量最接近,但它不是同一件事,这就是为什么您在尝试时会出错的原因-您无法通过使用类名限定引用来解析引用

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

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

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

(无需在接口中更改
initWithNSManagedObjectContext:
的声明-参数名称不需要匹配-因此,如果您不希望,您的“public”声明不需要在名称中使用u。)

您不需要。如果您想同时访问静态变量和局部变量,请为它们指定唯一的名称。这就是在局部变量前面加下划线
\uu
的约定要点,如果您使用
@properties
,就会自动这样做。您认为类方法如何访问任何实例方法或属性?你可能错过了学校的几个重要课程。
+ (void)initWithNSManagedObjectContext:(NSManagedObjectContext *)_managedObjectContext
{
   managedObjectContext = _managedObjectContext; 
}