接口中的变量声明问题

时间:2012-07-30 04:37:33

标签: objective-c ios variables

我是客观的新手。我在一个类文件中添加了一个接口,并在那里声明了一些变量。编译时,在所有声明中显示“在@interface和@protocol中声明变量”错误。 这是示例代码

#import "State.h"

@interface State(private)
NSString *forgotPassword=nil;
NSMutableArray *CategorySelection = nil;
NSMutableArray *subCategorySelection= nil;
NSString *string = nil;
int Tag= 0;
int alertTag=0;
NSURL *stringURL =nil;
NSURL *videoURL =nil;
NSURL *imageURL = nil;
int loginCount = 0;
NSMutableArray *album;
NSString *videoFileName = nil;
int videoCounting=0;
int loginUserId = 0;
int ImageTagg = 0;

@end

@implementation State

+(void) setforgotPasswordText:(NSString *) passwordText{
    forgotPassword = passwordText;
}

我是初学者,所以请指导我解决这个问题。感谢。

4 个答案:

答案 0 :(得分:4)

看起来你在班上宣布了category;您无法在类别中添加实例变量。

但是,您可以在类扩展中添加它们。为此,删除类别的名称(private),并删除初始化,保留代码如下:

@interface State () {
    // Note how the initialization is gone:
    NSString *forgotPassword;
    NSMutableArray *CategorySelection;
    // More variables; no initialization!
}
// More stuff...
@end

所有初始化都需要在指定的初始值设定项中进行(例如您的init方法),如下所示:

-(id)init {
    if (self = [super init]) { // Yes, it's =, not ==
        // Perform all your initialization here:
        *forgotPassword= ...;
        *CategorySelection = ...;
    }
    return self;
}

答案 1 :(得分:3)

如果您只想声明一个新类State,则声明您的实例变量(在大括号内,没有显式初始化):

@interface State
{
    NSString *forgotPassword;
    NSMutableArray *categorySelection;
    NSMutableArray *subCategorySelection;
    NSString *string;
    int tag;
    int alertTag;
    NSURL *stringURL;
    NSURL *videoURL;
    NSURL *imageURL;
    int loginCount;
    NSMutableArray *album;
    NSString *videoFileName;
    int videoCounting;
    int loginUserId;
    int imageTag;
}
@end

如果您正在使用ARC,则无需初始化它们,因为它会将所有这些设置为零或零。如果您不使用ARC(但为什么不使用ARC),则可以使用init方法初始化这些。

我注意到你正在编写自己的“setter”(例如setForgotPassword)。如果您希望编译器为您执行此操作(即为您“合成”它们),请首先将这些变量声明为属性,例如:

@interface State

@property (nonatomic, strong) NSString *forgotPassword;
@property (nonatomic, strong) NSMutableArray *categorySelection;
@property (nonatomic, strong) NSMutableArray *subCategorySelection;
@property (nonatomic, strong) NSString *string;
@property int tag;
@property int alertTag;
@property (nonatomic, strong) NSURL *stringURL;
@property (nonatomic, strong) NSURL *videoURL;
@property (nonatomic, strong) NSURL *imageURL;
@property int loginCount;
@property (nonatomic, strong) NSMutableArray *album;
@property (nonatomic, strong) NSString *videoFileName;
@property int videoCounting;
@property int loginUserId;
@property int imageTag;

@end

在声明属性后,您现在可以让编译器合成“setter”和“getters”。对于这些@property声明,如果您正在使用最新的编译器(Xcode 4.4 ...大约一周前出现),您不需要在{{1}中明确@synthesize它们}}。但是,如果您使用的是早期编译器,则需要为所有@implementation声明添加@synthesize,例如。

@property

如果你这样做(声明一个@implementation State @synthesize forgotPassword = _forgotPassword; @synthesize categorySelection = _categorySelection; @synthesize subCategorySelection = _subCategorySelection; @synthesize string = _string; // etc. 然后@property它),编译器将在幕后为你创建一个实例变量,然后自动生成一个“setter”(即方法是“set”,后跟您的变量名称,例如“setForgotPassword”)和“getter”方法(与您的变量同名的方法,它将为您检索变量内容)为您的每个属性。注意,对于所有这些属性,@synthesize也将生成实例变量,但是通过在ivar名称之前包含下划线,您将确保不会将属性@synthesize forgotPassword = _forgotPassword与实例混淆变量self.forgotPassword

如果您希望它成为一个类别(基本上是要添加要应用于现有类的新方法,通过引用现有类指定,_forgotPassword后跟类别指示符State) ,那么你不能包含新的变量。我不知道这是不是你的意图(我对此表示怀疑)。但是,如果你真的想这样做但你真的需要这些新变量,你可以改为继承你现有的State (private)类,如下所示:

State

如果您注意到,我还更改了您的变量名称以符合初始小写字母的Apple惯例。类以大写开头,变量以小写开头。

答案 2 :(得分:0)

变量声明应该在括号内,应该是这样的

@interface State(private)
{
NSString *forgotPassword;
NSMutableArray *CategorySelection;
NSMutableArray *subCategorySelection;
NSString *string;
int Tag;
int alertTag;
NSURL *stringURL;
NSURL *videoURL;
NSURL *imageURL;
int loginCount;
NSMutableArray *album;
NSString *videoFileName;
int videoCounting;
int loginUserId;
int ImageTagg;
}
-(void)sampleMethod1;
-(void)sampleMethod2;
-(void)sampleMethod3;
@end

在Brackets之后,您可以声明在类

中使用的方法

答案 3 :(得分:0)

问题是你正在@interface本身初始化变量。您只能声明变量,初始化在@implementation中完成。

因此你的@implementation应该包含,

@implementation

forgotPassword=nil;    
CategorySelection = nil;      
subCategorySelection= nil;   
string = nil;   
Tag= 0;   
alertTag=0;   
stringURL =nil;   
videoURL =nil;   
imageURL = nil;     
loginCount = 0;
videoFileName = nil;    
videoCounting=0;    
loginUserId = 0;    
ImageTagg = 0;    

@end

,而@interface包含,

@interface State       


NSString *forgotPassword;    
NSMutableArray *CategorySelection;    
NSMutableArray *subCategorySelection;     
NSString *string;    
int Tag;    
int alertTag;    
NSURL *stringURL;    
NSURL *videoURL;    
NSURL *imageURL;    
int loginCount;
NSMutableArray *album;    
NSString *videoFileName;    
int videoCounting;    
int loginUserId;    
int ImageTagg;    

@end

请注意,私有关键字已被删除。为了在objectice C中声明私有变量,我们在 .m 文件本身中声明它们。下面给出一个例子,

.h文件

@interface classname{
// variable declaration
}
//variable property declaration
//method declaration
@end

.m文件

@interface classname()
//private variables
@end

@implementation
//do your logic here
@end