-1

我正在尝试使用该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);
}
4

2 回答 2

2

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

NSString确实有一个uppercaseString方法,但这也无济于事,因为它返回一个值,并且在使用makeObjectsPerformSelector.

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

于 2013-07-20T09:48:38.677 回答
2

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

因此,您将发送uppercase:到数组中的每个 NSString 。但是 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]];
}
于 2013-07-20T09:52:30.037 回答