2011-12-31 2 views
0

Я пытаюсь использовать категорию, описанной в этой статье: http://iphonedevelopment.blogspot.com/2008/10/shuffling-arrays.htmlIOS Категория на NSArray Причины «экземпляр сообщения не объявлять метод с селектором»

Я установки следующие:

// NSArray+Shuffle.h 
#import <Foundation/Foundation.h> 
@interface NSArray (Shuffle) 
-(NSArray *)shuffledArray; 
@end 


// NSArray+Shuffle.m 
#import "NSArray+Shuffle.h" 
@implementation NSArray (Shuffle) 
-(NSArray *)shuffledArray 
{ 
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:[self count]]; 
    NSMutableArray *copy = [self mutableCopy]; 
    while ([copy count] > 0) 
    { 
     int index = arc4random() % [copy count]; 
     id objectToMove = [copy objectAtIndex:index]; 
     [array addObject:objectToMove]; 
     [copy removeObjectAtIndex:index]; 
    } 
// Using IOS 5 ARC 
// [copy release]; 
return array; 
} 
@end 

Тогда в моем коде, который я хочу использовать это, я импортировал Категория:

#import "NSArray+Shuffle.h" 

Затем я попытался использовать его как это:

NSArray *orderedGallary = [[NSArray alloc] initWithObjects: 
       [NSDictionary dictionaryWithObjectsAndKeys: 
        @"Pic1", @"pageName", 
        [UIImage imageNamed:@"Pic1.jpg"],@"pageImage", 
        nil], 
       [NSDictionary dictionaryWithObjectsAndKeys: 
        @"Pic2", @"pageName", 
        [UIImage imageNamed:@"Pic2.jpg"],@"pageImage", 
        nil], 

       nil]; 

    NSArray *shuffler = [[NSArray alloc] shuffledArray:orderedGallary]; 

    _pageData = [shuffler shuffledArray:orderedGallary]; 

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

ModelController.m: error: Automatic Reference Counting Issue: Receiver type 'NSArray' for instance message does not declare a method with selector 'shuffledArray:' 

Любые идеи?

ответ

2

shuffledArray - метод, который не принимает параметров, отличается от shuffledArray:, который является одним из методов, который принимает один параметр.

Похоже, что ты имел в виду:

NSArray* shuffled = [orderedGallery shuffledArray]; 

Здесь вы отправляете сообщение в исходный массив и возвращает новый массив, который перемешиваются.

+0

Это именно то, что я искал. Спасибо за урок/объяснение. Теперь, когда вы это описали, теперь совершенно понятно. – JasonBub

1

Вы объявили (в .h) и определили (в .m) метод с именем shuffledArray.

Вы вызываете метод с именем shuffledArray: (обратите внимание на двоеточие, указывающее аргумент).

Вы хотите называть

NSArray *shuffled = [orderedGallery shuffledArray]; 

вам не нужен аргумент, потому что вы посылаете метод упорядоченного массива.

(Там нет ни одного объекта, который на самом деле «пройдоха» - независимо от массива. - так я бы не использовать это имя в качестве имени переменной Массив перетасовки копию себя и возвращая новый перетасовал массив.)

1

Вы слишком стараетесь. Вам нужно только отправить -shuffledArray в orderedGallery.

NSArray *orderedGallary = [[NSArray alloc] initWithObjects: 
      [NSDictionary dictionaryWithObjectsAndKeys: 
       @"Pic1", @"pageName", 
       [UIImage imageNamed:@"Pic1.jpg"],@"pageImage", 
       nil], 
      [NSDictionary dictionaryWithObjectsAndKeys: 
       @"Pic2", @"pageName", 
       [UIImage imageNamed:@"Pic2.jpg"],@"pageImage", 
       nil], 

      nil]; 

_pageData = [orderedGallery shuffledArray]; 

Посмотрите, как вы объявили shuffledArray не принимать никаких аргументов? Просто отправка этого сообщения в любой экземпляр NSArray вернет ваш перетасованный массив.

+0

Да, вы правы. Я слишком старался. Спасибо за разъяснение. Я реализовал вышеупомянутое предложение. Еще раз спасибо! – JasonBub

1

shuffledArray не принимает параметр, но вызывается непосредственно на массиве:

NSArray *myShuffledArray = [orderedGallery shuffledArray]