2013-07-20 28 views
-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); 
} 
+2

难道是因为有对'NSString'没有这样的方法? –

+0

@JoshCaswell我试了两个它不会改变。 –

+0

咦?两者是什么? –

回答

2

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

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

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

+0

噢好吧,我完全误解了makeObjectsPerformSelector实用程序。谢谢。 –

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]]; 
} 
+0

谢谢你的例子。 –

相关问题