如何在单例 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
我用来存放从服务器下载的数组数据。 但是我无法将它们保存在单例数组中。
好像无法访问对象
为什么 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