我正在尝试使用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);
}
答案 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]];
}