2013-09-22 4 views
-1

У меня есть NSMutableArray как singleton; когда я пытаюсь добавить объект, я получаю ошибку сборки. Что не так с кодом?Ошибка сборки при попытке добавить объект в NSMutableArray singleton

Вот код singleton.h:

@interface SingletonArrayOfSelectedRows : NSObject { 
} 
@property (nonatomic, retain) NSMutableArray *arrayOfSelectedRows; 

+ (id)sharedArrayOfSelectedRows; 
@end 

Вот код singleton.m:

@implementation SingletonArrayOfSelectedRows { 

} 

@synthesize arrayOfSelectedRows; // rename 

// sharedSelectedCellIndexes 
+ (id)sharedArrayOfSelectedRows { 

static dispatch_once_t dispatchOncePredicate = 0; 
__strong static id _sharedObject = nil; 
dispatch_once(&dispatchOncePredicate, ^{ 
    _sharedObject = [[self alloc] init]; 
}); 

return _sharedObject; 
} 

-(id) init { 
self = [super init]; 
if (self) { 
    arrayOfSelectedRows = [[NSMutableArray alloc] init]; 
} 
return self; 
} 

@end 

Вот строки кода, где я получаю сообщение об ошибке:

SingletonArrayOfSelectedRows *arrayOfSelectedRows = [SingletonArrayOfSelectedRows sharedArrayOfSelectedRows]; 

    [arrayOfSelectedRows[indexPath.row] = [NSNumber numberWithInt:-1]; // reset it... 

И это ошибка:

Expected method to read array element not found on object of type 'SingletonArrayOfSelectedRows *'

ответ

-2

Я думаю, вам нужно создать подкласс от NSMutableArray:

@interface SingletonArrayOfSelectedRows : NSMutableArray { 
} 
@property (nonatomic, retain) NSMutableArray *arrayOfSelectedRows; 

+ (id)sharedArrayOfSelectedRows; 
@end 
+0

Помните, что NSMutableArray является частью кластера классов, который вводит еще несколько правил при подклассификации. По крайней мере, если вы хотите, чтобы ваш класс вел себя как настоящий NSMutableArray с добавленной функциональностью. См. Мое сообщение для документации по этому вопросу. – sofacoder

+0

Вы никогда не должны даже думать о подклассе NSMutableArray. – gnasher729

1

Я думаю, что вы хотите

SingletonArrayOfSelectedRows * arrayOfSelectedRows = [SingletonArrayOfSelectedRows sharedArrayOfSelectedRows]; 
// this adds sets the object at index indexPath.row of the property arrayOfSelectedRows 
arrayOfSelectedRows.arrayOfSelectedRows[indexPath.row] = [NSNumber numberWithInt:-1]; 

В своем коде вы лечите экземпляр SingletonArrayOfSelectedRows как NSMutableArray

2

pNre является правильно. Но если вы действительно хотите, чтобы ваш код работал, у вас есть два варианта:

  1. Подкласс. Это не так просто для NSMutableArray, потому что это кластер классов. Поэтому просто подклассифицировать его (например, ennuikiller) недостаточно. have a look at this.

  2. Объект Subscriptip. Это относительно новая техника, введенная с Xcode 4.4. Это в основном позволяет вам переопределить оператор «[]» для вашего класса. Посмотрите на this post, если вы заинтересованы в этом.

0

Вы просто смущены тем, что хотели.

Если вы изменяете

+ (id)sharedArrayOfSelectedRows; 

в

+ (<putherethetypethatyoureallywanted)sharedArrayOfSelectedRows; 

то станет совершенно очевидно, где вы собираетесь не так.

Смежные вопросы