无法识别的选择器设置为实例

时间:2013-07-20 09:32:01

标签: ios objective-c

我正在尝试使用makeObjectsPerformSelector方法。

这是我的代码。 我不明白为什么当我使用选择器makeObjectsPerformSelector拨打uppercase:时却找不到它...

#import "testAppViewController.h"

@interface testAppViewController ()
- (void)uppercase;

@property (nonatomic, strong) NSMutableArray *arrayTest;

@end

@implementation testAppViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self start];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)uppercase
{
    NSLog(@"---");
}

- (void) start
{
    self.arrayTest = [[NSMutableArray alloc] init];
    [self.arrayTest addObject:@"toto"];
    [self.arrayTest addObject:@"tata"];
    [self.arrayTest addObject:@"titi"];
    [self.arrayTest addObject:@"tutu"];


    for (NSString *s in self.arrayTest)
        NSLog(@"1 - %@", s);

    [self.arrayTest makeObjectsPerformSelector:@selector(uppercase)];

    for (NSString *s in self.arrayTest)
        NSLog(@"2 - %@", s);
}

2 个答案:

答案 0 :(得分:2)

makeObjectsPerformSelector调用数组中对象的方法,而不是类中的方法(实际上与数组内容完全无关)。因此,错误是因为NSString没有uppercase方法(有或没有参数)。

NSString确实有uppercaseString方法,但这不会对您有所帮助,因为它会返回一个值,并且在使用makeObjectsPerformSelector时会丢失。

您可能希望使用其他方法迭代数组内容以处理字符串。

答案 1 :(得分:2)

makeObjectsPerformSelector:会将指定的选择器发送到数组中的每个对象。

因此,您要向阵列中的每个NSString发送uppercase:。但NSString没有名为uppercase:的方法。您在您自己的类中实现了该方法。

但即使您调用uppercaseString(NSString实现)也无法工作,因为对象无法替换自身。

实现这项工作的一种方法是NSMutableString上的类别。

@interface NSMutableString (MBUpperCase)
- (void)makeUpperCase;
@end

@implementation NSMutableString (MBUpperCase)
- (void)makeUpperCase {
    [self setString:[self uppercaseString]];
}
@end



    NSMutableArray *arrayTest = [[NSMutableArray alloc] init];
    [arrayTest addObject:[@"toto" mutableCopy]];
    [arrayTest addObject:[@"tata" mutableCopy]];
    [arrayTest addObject:[@"titi" mutableCopy]];
    [arrayTest addObject:[@"tutu" mutableCopy]];


    NSLog(@"%@", arrayTest);

    [arrayTest makeObjectsPerformSelector:@selector(makeUpperCase)];

    NSLog(@"%@", arrayTest);

但你可能根本不应该这样做。这闻起来非常糟糕。

这要好得多:

NSMutableArray *upperCaseArray = [NSMutableArray arrayWithCapacity:[arrayTest count]];
for (NSString *string in arrayTest) {
    [upperCaseArray addObject:[string uppercaseString]];
}