1

我有一个带有 NSMutableDictionary 变量的头文件和一个如下的函数

#import <Foundation/Foundation.h>
@interface Client : NSObject{}; 
@property (assign)NSMutableDictionary *dict;
- (NSMutableDictionary *)myDict;
@end

在 .m 文件中

@implementation Client
{
NSMutableDictionary *dict;//=[[NSMutableDictionary alloc]initWithCapacity:10];
}
-(NSMutableDictionary *):myDict{
return dict;
}

我的问题是我必须在哪里初始化字典?这样我就可以使用 Client.myDict 之类的东西从项目中的任何地方访问它。(它必须返回所有键值对)

4

1 回答 1

1

您正在定义一个方法,myDict以检索dict属性的值。但是当编译器合成那个属性时,它会自动合成一个dictgetter方法,所以不需要这个myDict方法。你可以删除它。

通常你会做这样的事情:

#import <Foundation/Foundation.h>

@interface Client : NSObject
@property (nonatomic, strong) NSMutableDictionary *dict;
@end

请注意,该行没有大括号和分号@interface

并且,在回答您关于如何初始化属性(或者,从技术上讲,合成实例变量)的问题时,您可以在类的init方法中执行此操作:

@implementation Client

- (id)init
{
    self = [super init];
    if (self) {
        _dict = [[NSMutableDictionary alloc] init];
    }

    return self;
}

@end

请注意,不需要显式声明的实例变量,因为编译器会为您合成一个(带有前导下划线)。此外,也不需要编写“getter”方法,因为编译器也会为您合成它。

如果您使用的是 ARC(我希望您是),您可以将其替换assignstrong,就像我在上面所做的那样。但是,如果您不使用 ARC,则将其保留为retain,但是您必须编写一个dealloc方法(但如果您有 ARC,则不要编写此方法):

- (void)dealloc
{
    [_dict release];
    [super dealloc];
}

然后你可以像这样使用这个类:

Client *client = [[Client alloc] init];
[client.dict addObject:@"One"];

// you can access it this way

NSLog(@"client.dict = %@", client.dict);

// or this way

NSLog(@"[client dict] = %@", [client dict]);
于 2013-11-08T23:36:47.933 回答