-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 が実装する) を呼び出しても機能しません。

これを機能させる 1 つの方法は、上のカテゴリ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 に答える