NSMutableArray的类型说明符?

时间:2014-12-30 22:40:02

标签: ios objective-c xcode nsmutablearray

我试图声明一个NSMutableArray用于保存一些Contact个对象。我按照这个问题how and where do I initialize an global NSMutableArray in Xcode 5中的说明进行操作。但是已经离开了@synthesize因为根据这个wikipedia page它说它隐含在较新版本的xcode中。我也尝试过包含它并得到同样的错误,所以我不认为这是问题,但我只是想提一下。

我收到这些错误errors,但无法弄清楚它们究竟是什么意思,因为根据这些问题: 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

4 个答案:

答案 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];
}

(静态全局变量的命名约定我将留下另一个对话。)