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

Ios 无法识别的选择器设置为实例,ios,objective-c,Ios,Objective C,我正在尝试使用makeObjectsPerformSelector方法 这是我的密码。 我不明白为什么当我用选择器大写:调用makeObjectsPerformSelector时,它找不到它 #import "testAppViewController.h" @interface testAppViewController () - (void)uppercase; @property (nonatomic, strong) NSMutableArray *arrayTest; @end

我正在尝试使用
makeObjectsPerformSelector
方法

这是我的密码。 我不明白为什么当我用选择器
大写:
调用
makeObjectsPerformSelector
时,它找不到它

#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);
}

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

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


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

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

因此,您正在向数组中的每个NSString发送
大写:
。但是NSString没有名为
大写:
的方法。您在自己的类中实现了该方法

但是,即使您调用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]];
}

可能是因为在
NSString
上没有这样的方法吗?@JoshCaswell我尝试了这两种方法,但都没有改变。@JoshCaswell带参数和不带参数。我是Objective-C开发的新手。你不必粗鲁…@middaparka我试过它不起作用,我编辑了我的代码我在堆栈上编辑代码时犯了一个错误。但在我的代码中它是可以的。但是我仍然有错误。哦,好吧,我完全误解了makeObjectsPerformSelector实用程序。谢谢,谢谢你的例子。