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

时间:2013-12-28 22:00:55

标签: ios objective-c

我遇到一些关于在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;
}

完美无缺。我的问题是,如果它们具有相同的名称,如何使用这些变量(静态变量和函数参数变量)?

2 个答案:

答案 0 :(得分:2)

静态变量与您的managedObjectContext一样,是最接近类变量的东西,Objective-C提供这不是一回事,这就是为什么你在做你正在尝试的事情时会遇到错误 - 你无法通过用类名来限定它来解决你的引用。

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

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

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

(并且无需在界面中更改initWithNSManagedObjectContext:的声明 - 参数名称不需要匹配 - 因此,如果不这样,您的“公共”声明不需要名称中的_希望它。)

答案 1 :(得分:0)

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