如何在单例 NSMutableArray 中添加对象

How to add object in singleton NSMutableArray

我用来存放从服务器下载的数组数据。 但是我无法将它们保存在单例数组中。

好像无法访问对象

为什么 ulatitude、ulongitude、uaccuracy、uplacename 为零?...

在 .h 文件中

#import <Foundation/Foundation.h>
@interface LocationData : NSObject
{
    NSMutableArray *ulatitude;
    NSMutableArray *ulongitude;
    NSMutableArray *uaccuracy;
    NSMutableArray *uplacename;
}
@property (nonatomic, retain) NSMutableArray *ulatitude;
@property (nonatomic, retain) NSMutableArray *ulongitude;
@property (nonatomic, retain) NSMutableArray *uaccuracy;
@property (nonatomic, retain) NSMutableArray *uplacename;
+ (LocationData*) sharedStateInstance;
@end

在 .m 文件中

#import "LocationData.h"

@implementation LocationData

@synthesize uaccuracy;
@synthesize ulatitude;
@synthesize ulongitude;

+ (LocationData*) sharedStateInstance {
        static LocationData *sharedStateInstance;

        @synchronized(self) {
            if(!sharedStateInstance) {
                sharedStateInstance = [[LocationData alloc] init];
            }
        }
        return sharedStateInstance;
}
@end

使用

[manager POST:urlStr parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject)
    {

                 NSLog(@"%@",responseObject);

                 // json response array
                 if ([responseObject isKindOfClass:[NSArray class]]) {

                     NSArray *responseArray = responseObject;
                     NSDictionary *responseDict = [[NSDictionary alloc] init];

                     LocationData* sharedState = [LocationData sharedStateInstance];

                     for(NSUInteger i=0; i < responseArray.count; i++)
                     {
                         responseDict = [responseArray objectAtIndex:i];

                         double dlat = [[responseDict objectForKey:@"lat"] doubleValue];
                         double dlng = [[responseDict objectForKey:@"lng"] doubleValue];

                          [[sharedState ulatitude] addObject:[NSString stringWithFormat:@"%f",dlat]];
                          [[sharedState ulongitude] addObject:[NSString stringWithFormat:@"%f",dlng]];
                          [[sharedState uaccuracy] addObject:[responseDict objectForKey:@"rad"]];
                          [[sharedState uplacename] addObject:[responseDict objectForKey:@"place_name"]];
}

您总是需要初始化数组。在尝试向它们添加内容之前,您应该先做一些事情:

arrayName = [[NSMutableArray alloc] init];

否则你总是会出错,因为它们还没有被初始化。

在您的情况下,您应该像这样重写 LocationData init 函数:

- (instancetype)init {
    self = [super init];
    if (self) {
        self.yourArrayName = [[NSMutableArray alloc] init];
        // And so on....
    }
    return self;
}

你没有allocate/init任何数组...

你可以在你的单例创建方法中创建它们

+ (LocationData*) sharedStateInstance {
        static LocationData *sharedStateInstance;

        @synchronized(self) {
            if(!sharedStateInstance) {
                sharedStateInstance = [[LocationData alloc] init];
                sharedStateInstance.ulatitude = [[NSMutableArray alloc] init];
                // (add others...)
            }
        }
        return sharedStateInstance;
}

用下面的代码替换您的 LocationData.m 文件,这样就可以了。因为你必须分配和初始化数组,所以你只能在数组

中添加对象
+ (LocationData*) sharedStateInstance {
            static LocationData *sharedStateInstance;
                    @synchronized(self) {
                    if(!sharedStateInstance) {
                        sharedStateInstance = [[LocationData alloc] init];
                        uaccuracy = [[NSMutableArray alloc]init];
                        ulatitude = [[NSMutableArray alloc]init];
                        ulongitude = [[NSMutableArray alloc]init];
                        uplacename = [[NSMutableArray alloc]init];
                    }
                }

            return sharedStateInstance;
    }

您需要正确初始化您的对象。基本上你的成员变量("ivars")没有指向任何东西("nil")。

添加到您的 .m 文件代码中的这个初始化程序可以完成这项工作。

-(instancetype)init {
    if ((self = [super init])) {
                    self.accuracy = [NSMutableArray array];
                    self.latitude = [NSMutableArray array];
                    self.longitude = [NSMutableArray array];
                    self.uplacename = [NSMutableArray array];
    }
    return self;
}

作为单例模式,我更喜欢以下内容:

+ (LocationData*) sharedStateInstance {
    static LocationData *sharedStateInstance = nil;
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        sharedStateInstance = [[LocationData alloc] init];
    });
    return sharedStateInstance;
}

尽管单身人士可能没有人们常说的那么糟糕,但我不认为这对他们来说是个好用法。不过,您的具体问题与该设计选择无关。

试试这个代码。为您的 NSMutableArrays 编写 getter。

#import <Foundation/Foundation.h>
@interface LocationData : NSObject

@property (nonatomic, retain) NSMutableArray *ulatitude;
@property (nonatomic, retain) NSMutableArray *ulongitude;
@property (nonatomic, retain) NSMutableArray *uaccuracy;
@property (nonatomic, retain) NSMutableArray *uplacename;
+ (LocationData*) sharedStateInstance;
@end


#import "LocationData.h"

@implementation LocationData

@synthesize uaccuracy = _uaccuracy;
@synthesize ulatitude = _ulatitude;
@synthesize ulongitude = _ulongitude;

+ (LocationData*) sharedStateInstance {
        static LocationData *sharedStateInstance;

        @synchronized(self) {
            if(!sharedStateInstance) {
                sharedStateInstance = [[LocationData alloc] init];
            }
        }
        return sharedStateInstance;
}


-(NSMutableArray*)uaccuracy
{
    if(_uaccuracy == nil)
    {
        _uaccuracy = [[NSMutableArray alloc]init];
    }
    return uaccuracy;
}

-(NSMutableArray*)ulongitude
{
    if(_ulongitude == nil)
    {
        _ulongitude = [[NSMutableArray alloc]init];
    }
    return ulongitude;
}

-(NSMutableArray*)ulatitude
{
    if(_ulatitude == nil)
    {
        _ulatitude = [[NSMutableArray alloc]init];
    }
    return ulatitude;
}

-(NSMutableArray*)uplacename
{
    if(_uplacename == nil)
    {
        _uplacename = [[NSMutableArray alloc]init];
    }
    return uplacename;
}
@end