Категория IOS на NSArray Причины "сообщение экземпляра не объявляет метод с селектором" - PullRequest
0 голосов
/ 31 декабря 2011

Я пытаюсь использовать категорию, описанную в этой статье: http://iphonedevelopment.blogspot.com/2008/10/shuffling-arrays.html

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

//  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:'

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 31 декабря 2011

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

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

NSArray* shuffled = [orderedGallery shuffledArray];

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

1 голос
/ 31 декабря 2011

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

NSArray *myShuffledArray = [orderedGallery shuffledArray]
1 голос
/ 31 декабря 2011

Ты слишком стараешься.Вам нужно только отправить -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 вернет ваш перемешанный массив.

1 голос
/ 31 декабря 2011

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

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

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

NSArray *shuffled = [orderedGallery shuffledArray];

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

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

...