使用参数格式化Objective-C方法签名的正确方法是什么?

时间:2013-09-18 23:45:19

标签: objective-c methods initialization nsarray

我是一名网页设计师/开发人员,他最终决定尝试使用Objective-C。我坚信标准并遵守语言提出的任何指导方针,格式或不成文规则,而不是试图扼杀我自己对如何做或使用我自己的方法的想法(双关语不是,但我会跟着吧)。换句话说,我愿意用camelCaseVarNamesunderscore_var_names编写代码;我只想知道用这种语言完成“普遍接受”的方式。

无论如何,我想知道编写Objective-C方法的正确方法 - 特别是在扩展现有类时。请注意,我正在采取措施,所以我现在并不担心MVC设计模式或任何“关注点分离”。我正在使用默认的AppDelegate实现文件(是的,我是个坏蛋)。我喜欢认为这相当于在学习CSS时在HTML文件的<head>中编写一堆样式;我只是想看看这个按钮做了什么以及该按钮做了什么。有意义吗?

好的,这是一个场景。假设您想编写一个简单的方法来检查视图是否属于某个类。我确信有很多方法可以做到这一点(也许每个NSObject都有这种能力,而不需要这样的功能),但幽默我。这就是我想到的(随意笑):

- (BOOL)viewInstance:(id)view isOfClass(NSString *)className
{
    return ( [view class] == NSClassFromString(className) );
}

我遇到的问题是viewInstance:本身是毫无意义的,从我读过的内容来看,Objective-Cer喜欢superRichAndDescriptiveMethodNamesThatAreSelfDocumenting。话虽如此,整个方法名称包括第二部分 - 我假设第二部分是命名参数或参数。因此,当一起阅读时,它实际上有点意义。我所谈论的一个真实世界的例子是NSColor的{​​{1}}方法。在我意识到colorWithDeviceRed是第一个参数之前,我经历了弹出完成列表20次!完整的声明是:

Red:

我想我对于何时和/或如何以某些方式命名功能感到困惑。此外,对象的初始化让我感到困惑。在我所知的语言中,我会创建一个这样的数组:

+ (NSColor *)colorWithDeviceRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha

在Objective-C中,我不知道使用哪个:

// JavaScript
var myArray = [ 1, 2, 3 ];

// PHP
$my_array = array( 1, 2, 3 );

// AppleScript
set myArray to { 1, 2, 3 }

// ActionScript
var myArray:Array = new Array( 1, 2, 3 );

// Python
my_array = [ 1, 2, 3 ]

// P.S. I add spaces between brackets because I'm a special boy, so no judgments.

数组文字对我来说是最不可怕的,因为它最有意义来自其他语言。我真正不明白的是,在上述陈述中,有NSArray *myArray = [NSArray new]; NSArray *myArray = [NSArray array]; NSArray *myArray = [[NSArray alloc] init]; NSArray *myArray = [[NSArray alloc] initWithArray:@[1,2,3]]; NSArray *myArray = [NSArray arrayWithArray:@[1,2,3]]; NSArray *myArray = @[1,2,3]; 方法和initWithArray方法。嗯。它是否称为相同的基础方法?

真正让我感到困惑的是:

arrayWithArray

在查看NSDictionary的头文件后,它看起来是两个单独的方法。我习惯于看到可选的参数,如:

[[NSDictionary alloc] initWithDictionary:(NSDictionary)]
[[NSDictionary alloc] initWithDictionary:(NSDictionary) copyItems:(bool)]

在我的例子中,我将有一个可选参数,当包含它时会改变函数的流程。关于这两种方法,我可能完全错了,但从我对Objective-C的了解,这就是它的样子。但是,我不会因为我是一个小网络游戏而逃跑。是的,我可以让线程进入睡眠并编写像function initWithObject(object, copyItems) { var obj = {}; if ( copyItems ) { ... } return obj; } 这样的东西,这有点可怕,但我想在你们的帮助下,我实际上可以学到一两件事。所以,请教我!

我的写作有时可能有点“罗嗦”,所以感谢您阅读这篇文章。

1 个答案:

答案 0 :(得分:1)

这个问题对Stack Overflow来说有点不重要,但你确实有一些明确的问题。对于编码标准,首先阅读Apple's guidelines并查看Apple源代码。尝试始终阅读带有完整签名的方法。 NSColor colorWithDeviceRed:green:blue:alpha: - 这是编译器理解它们的方式。

虽然ARC处理释放/保留,但是初始化集合是一​​个遗留问题,基本上使用“init”格式将返回一个保留对象,类方法[NSArray array]将返回一个自动释放的对象。我会使用@[ ],因为它很简短明了。

使用字典实例化问题,将一个字典初始化为另一个字典使得A中包含的对象现在也包含在B中。如果您确实希望A中包含的对象的副本进入B,{{1}将执行这些项目的(浅)副本。

initWithDictionary:copyItems:

通常,除非您知道需要复制,否则无需复制。祝你好运!