在我看来,将setString:发送到尚未调用NSMutableStringinit本身并不会调用init。例如:

NSMutableString *string;   // Declare, but do not init yet
[string setString:@"foo"];
NSLog (@"%@",string);      // Prints "(null)"


我想覆盖此行为,因此基本上

- (void) setString:(NSString *)aString
{
    if (!self)
    {
        self = [self initWithString:aString];
    }
    else
    {
        [super setString:aString];
    }
}


我可以使用子类来做到这一点,但是我必须遍历我的项目,并用子类替换所有NSMutableString,这很痛苦。我正在查看Apple Docs,看起来我想做的就是为NSMutableString创建类别。我以前没有使用过类别,所以我有几个问题:

首先,看起来类别仅允许我添加新方法,而不允许我覆盖现有方法。我想创建一个满足我要求的setStringWithInit:方法很容易,因此,第一个问题毕竟不是真正的问题(尽管我仍然需要通过我的项目为setString进行查找替换) ,但哦)。

其次,更重要的是,如何检查新方法的发送者是否为nil?如果setString:返回的内容不是void,我想我可以使它工作,但事实并非如此。如何从上面的代码中获取if (!self)检查以使用类别?

还是类别不是解决这类问题的方法,毕竟我最好还是进行子分类?

编辑:
因此,我在其上使用的字符串实际上将是自定义@property子类的NSObject。在我的代码中,我实际上将调用[myObject.someProperty setString:@"foo"];,当我尝试执行此操作时,调试器将向我显示someProperty为零。另外,在我应用程序的其他部分中,我正在检查if (!myObject.someProperty)以查看该属性是否已被使用,所以我不想只是在self.someProperty = [[NSMutableString alloc] init];类的init方法中自动使用myObject

尽管现在考虑了一下,但我想我可以用if (!myObject.someProperty)代替if ([myObject.someProperty length] == 0)了,这将使我能够立即进行分配和初始化操作。但是,如果我立即初始化所有内容,那将为其创建一些内存空间,对吗?不过这可能微不足道。嗯,也许这是我应该做的。

最佳答案

正确的代码将是:

NSMutableString *string = [NSMutableString string];
[string setString:@"foo"];
NSLog (@"%@",string);


为什么不初始化变量?无需覆盖setString:或任何其他方法。不要试图将NSMutableString与其他任何类区别对待。

此外,覆盖setString:仍然无法解决任何问题。只要指针是nil,就不能在其上调用方法。

关于ios - 带有类别的nil对象上的setString,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20551406/

10-11 19:24