在我看来,将setString:
发送到尚未调用NSMutableString
的init
本身并不会调用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/