我试图声明一个NSMutableArray用于保存一些Contact
个对象。我按照这个问题how and where do I initialize an global NSMutableArray in Xcode 5中的说明进行操作。但是已经离开了@synthesize
因为根据这个wikipedia page它说它隐含在较新版本的xcode中。我也尝试过包含它并得到同样的错误,所以我不认为这是问题,但我只是想提一下。
我收到这些错误,但无法弄清楚它们究竟是什么意思,因为根据这些问题: Type of class in a NSMutableArray Can I restrict the NSMutableArray object type? Is there any way to enforce typing on NSArray, NSMutableArray, etc.?
NSMutableArrays不会强制放入其中的对象类型。
我做错了什么,这些错误意味着什么?这是我的第一个Objective C项目,我相信这是一个简单的问题,但它是一个我无法弄清楚并且几个小时让我感到沮丧的问题。
这是我的头文件:
#import <Foundation/Foundation.h>
#import "Contact.h"
@interface ContactList : NSObject
@property (strong, readwrite, nonatomic) NSMutableArray *contactList;
+ (BOOL) addContact: (Contact *) contact;
- (BOOL) emptyContactList;
//- (BOOL) buildContactList
@end
这是我的实施文件:
#import "ContactList.h"
@implementation ContactList
contactList = [[NSMutableArray alloc] init];
+ (BOOL) addContact: (Contact *) contact
{
return YES;
}
- (BOOL) emptyContactList
{
return YES;
}
@end
答案 0 :(得分:1)
无论如何,在审议你的财产时我相信自己需要在前面,如self.contactList
但是要初始化,你应该通过覆盖实现文件中属性的“getter”来进行延迟实例化。
我相信它会是
// The getter method for property "contactList"
-(NSMutableArray *)contactList {
// If no array exists, create one.
if (!_contactList) {
_contactList = [[NSMutableArray alloc]init]
}
return _contactList;
}
答案 1 :(得分:0)
要添加已经正确的答案,如果数组需要作为类初始化的一部分存在,则可以在init方法中包含它的设置:
-(instancetype) init{
self = [super init];
if(self){
_contactList = [NSMutableArray alloc] init];
}
return self;
}
请注意,您无法在类方法中设置实例变量。这意味着,您只能在创建+addContact:
类的实例后调用ContactList
方法。否则,无论您添加了多少Contact
个
This resource可能会为您提供有关类构造函数的其他见解
答案 2 :(得分:-1)
确定。看起来您有一个包含属性ContactList
的类contactList
,其中contactList
是一个可变数组。
我从不喜欢使用不同情况的相同单词来表示不同的东西,所以我会更改属性的名称。
使用带有大写字母的类名(例如ContactList
)和小写的实例变量(contactList
)是我见过的相当多的东西。 (但我也不喜欢这样。以后会引起混淆。)
这只是我的意见。
@implementation ... @end块中有一行可执行代码,不在任何方法或函数中:
contactList = [[NSMutableArray alloc] init];
你做不到。所有可执行代码必须位于某个方法或函数内。这就是编译器告诉你的。
你应该为你的班级定义一个自定义的init方法,如@LouisTur在他的回答中所描述的那样。
答案 3 :(得分:-1)
看起来这个文件试图声明一个名为&#34; contactList&#34;的全局变量。并设置它。
但是,当在方法或@interface之外声明时,变量必须通过键入,就像C全局一样。如果要创建此类全局,请尝试以下操作。 (请注意,由于在Objective-C完全设置之前调用alloc / init,这通常会在运行时在运行时导致内存泄漏消息。)
static NSMutableArray* contactList = [[NSMutableArray alloc]init];
要使用更多的Objective-C解决方案,请声明静态并将其设置为nil(不提供任何消息),然后在+ initialize方法中设置它。 (谷歌+初始化,看到很多关于如何保证Objective-C被保证只被调用一次的好解释。)
static NSMutableArray* contactList = nil;
+ (void) initialize {
contactList = [[NSMutableArray alloc]init];
}
(静态全局变量的命名约定我将留下另一个对话。)