Ios 通过点运算符访问的类方法

Ios 通过点运算符访问的类方法,ios,class-method,nsmutablestring,Ios,Class Method,Nsmutablestring,这个问题与知道一些我们不知道的事情有关。我在研究为什么人们不用这个?这背后的原因是否与特定技术有关?所以仔细阅读,投否决票或给出正确答案 我们可以写作 NSMutableString *string = NSMutableString.string; 而不是 NSMutableString *string = [NSMutableString string]; 和我们怎么写这个方法一样 NSMutableString *string = [NSMutableString stringWith

这个问题与知道一些我们不知道的事情有关。我在研究为什么人们不用这个?这背后的原因是否与特定技术有关?所以仔细阅读,投否决票或给出正确答案

我们可以写作

NSMutableString *string = NSMutableString.string;
而不是

NSMutableString *string = [NSMutableString string];
和我们怎么写这个方法一样

NSMutableString *string = [NSMutableString stringWithString:@"test"];
更新:


这个问题不是重复的,有点不同。我接受下面的答案,这对优秀的程序员是不推荐的。但是他们没有解释为什么,出于什么原因,程序员应该避免这样做?有人能用适当的链接或文件对此做出明确的解释吗

这只是一种语法上的糖分。string方法没有参数,所以它被当作getter处理,而实际上不是。stringWithString:是带参数的方法,所以不能这样调用

一般来说,我不建议在方法中使用点语法,这会让人困惑。

更新

我不认为有任何技术上的理由你应该避免它。 它相当于一种编码风格,保持代码干净一致。

NSMutableString.string是一种黑客行为。其工作原理与myString.length和[myString length]产生相同结果的原因相同。然而,由于点表示法未与实际属性一起使用,这是对语言功能的滥用,因为属性具有不同的语义。例如,当您多次访问属性时,您自然希望得到相同的结果,除非在两次调用之间对象的状态发生了更改。由于NSMutableString.string在每次调用时都会生成一个新的string对象,因此它会破坏正确属性的语义预期,降低程序的可读性

Objective-C没有使用点表示法调用带有参数的方法的通用方法。有一个特性非常特定于属性。虽然理论上可以使用MyClass.xyz=abc代替[MyClass setXyz:abc],但这也是一种攻击


为了回答您的问题,Objective-C没有提供使用点表示法调用[NSMutableString stringWithString:@test]的方法。

NSMutableString.string;不应使用。这个语法应仅用于属性,而不是普通方法。由于Objective-C消息的分类方式,它也适用于没有任何参数的方法。但我们不应该这样使用它。@rckoenes我的朋友,你在哪里看到我们不应该用这个点作为类的方法?请显示一些引用。这是一个方法,而不是属性。语法用于属性。从苹果文档中:@rckoenes我知道,属性应该通过访问,getter或setter方法。我的问题是关于课堂教学法?您在哪里看到类方法不应该使用。`operator?@Mani nowhere,但也没有指定您应该使用的地方。当混合使用属性表示法和方法表示法时,您的代码将变得不可读。我可以部分接受。我认为,这句话的点表示法不适用于实际属性,不应该是正确的吗?你怎么说?能否显示一些链接或规范?请参阅我更新的问题。@Mani我用一个简短的示例扩展了答案,说明了通过属性语法调用NSMutableString.string的错误。@Mani这里有两种不同的语义可供查看,一种用于编译器,另一种用于代码读者。编译器将[NSMutableString]和NSMutableString.string视为表达同一事物的不同方式;它将生成相同的精确代码。但是,程序的读者希望第二个表达式表示与状态相关的内容。他们需要几秒钟才能破译程序的含义,这是非常糟糕的。@Mani您可以调用类方法这一事实本身就是一个不幸的技术巧合:出于某种原因,编译器设计者没有添加代码来禁止这种调用,因此当x.y代码被翻译为[x y]时,它也适用于类方法。我接受一件事,这不是所有程序员都推荐的。我的问题是为什么?为什么?。您是指不带参数的类方法,被视为getter方法吗?这是正确的吗?看我更新的问题…我的朋友,我知道这不是正确的编码方式。我在研究为什么人们不用这个?是否有任何原因与特定技术相关?我需要知道这一点。