【问题标题】:Objective-C Categories: Method not calledObjective-C 类别:方法未调用
【发布时间】:2019-02-28 09:20:45
【问题描述】:

我正在尝试通过阅读“学习 Objective-C 2.0”来学习 Objective-C 的基础知识。有一个关于类别的练习,您要求通过使用类别向 NSString 添加方法。我的简单程序如下。它(应该)取一个字符串,然后颠倒单词的顺序。

主要

#import <Foundation/Foundation.h>
#import "CatNSString.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {

    NSString *test = @"Dog bites Man";
    NSString *test1 = nil;

    test1 = [test1 reverseWords: test];

    NSLog(@"%@ : %@", test, test1);

}
return 0;

}

界面

#import <Foundation/Foundation.h>

@interface NSString (CatNSString)

- (NSString*) reverseWords:(NSString*)string;

@end

实施

#import "CatNSString.h"

@implementation NSString (CatNSString)

- (NSString*) reverseWords: (NSString*) string
{
    NSString *stringReturn = nil;
    NSArray *arrayString = [string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

    stringReturn = [string stringByAppendingString:@"hello"];


    for (NSString *word in arrayString)
    {
        NSString *stringTmp1 = word;
        NSString *stringTmp2 = stringReturn;
        stringReturn = [stringTmp1 stringByAppendingString:stringTmp2];
        NSLog(@"stringTmp1: %@", stringTmp1);

    }

    return stringReturn;
}


@end

它可以编译,但程序的行为就像从未调用过该方法一样。如果我在方法中调用NSLog,则控制台没有输出。谁能看到我没有做而我应该做的事情?

【问题讨论】:

  • 因为test1 是nil。您不要在该方法中使用self(或隐含地使用其实例方法或属性之一)。所以应该是一个类方法:- (NSString*) reverseWords:(NSString*)string;=>+(NSString*) reverseWords:(NSString*)string;,然后test1 = [test1 reverseWords: test];应该是test1 = [NSString reverseWords: test];
  • 嗨 Larme,谢谢,我已经将该方法转换为类方法,然后再次尝试将 test1 初始化为除 nill 之外的其他方法。该方法被调用了两次。再次感谢您的宝贵时间。

标签: objective-c


【解决方案1】:

你只是做错了。

这是定义类别的正确方法:

@interface NSString (CatNSString)
-(NSString *)reverse;
@end

@implementation NSString (CatNSString)
-(NSString*)reverse {
    // `Self` keyword will refer to your original string, no need to pass it as a parameter
    NSArray *words = [self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    return [[[words reverseObjectEnumerator] allObjects] componentsJoinedByString:@" "];
}
@end

在您的主代码中,执行以下操作:

NSString *test = @"Dog bites Man";
NSLog(@"%@", [test reverse]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    相关资源
    最近更新 更多