我遇到一些关于在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;
}
完美无缺。我的问题是,如果它们具有相同的名称,如何使用这些变量(静态变量和函数参数变量)?
答案 0 :(得分:2)
静态变量与您的managedObjectContext
一样,是最接近类变量的东西,Objective-C提供但这不是一回事,这就是为什么你在做你正在尝试的事情时会遇到错误 - 你无法通过用类名来限定它来解决你的引用。
在(Objective-)C中,在任何函数/方法之外声明的静态变量具有全局生存期和文件范围 - 即该变量始终存在但仅可从在与其声明相同的源文件中。在引用静态时,没有“文件范围”限定符可用于解决歧义/隐藏,内部作用域中具有相同名称的任何变量都将隐藏静态。
在您的情况下,您可以使用:
+ (void)initWithNSManagedObjectContext:(NSManagedObjectContext *)_managedObjectContext
{
managedObjectContext = _managedObjectContext;
}
(并且无需在界面中更改initWithNSManagedObjectContext:
的声明 - 参数名称不需要匹配 - 因此,如果不这样,您的“公共”声明不需要名称中的_希望它。)
答案 1 :(得分:0)
方法参数和实例变量应具有不同的名称。当它们相同时,编译器应警告您使用方法变量。