我是一名网页设计师/开发人员,他最终决定尝试使用Objective-C。我坚信标准并遵守语言提出的任何指导方针,格式或不成文规则,而不是试图扼杀我自己对如何做或使用我自己的方法的想法(双关语不是,但我会跟着吧)。换句话说,我愿意用camelCaseVarNames
或underscore_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;
}
这样的东西,这有点可怕,但我想在你们的帮助下,我实际上可以学到一两件事。所以,请教我!
我的写作有时可能有点“罗嗦”,所以感谢您阅读这篇文章。
答案 0 :(得分:1)
这个问题对Stack Overflow来说有点不重要,但你确实有一些明确的问题。对于编码标准,首先阅读Apple's guidelines并查看Apple源代码。尝试始终阅读带有完整签名的方法。 NSColor colorWithDeviceRed:green:blue:alpha:
- 这是编译器理解它们的方式。
虽然ARC处理释放/保留,但是初始化集合是一个遗留问题,基本上使用“init”格式将返回一个保留对象,类方法[NSArray array]
将返回一个自动释放的对象。我会使用@[ ]
,因为它很简短明了。
使用字典实例化问题,将一个字典初始化为另一个字典使得A中包含的对象现在也包含在B中。如果您确实希望A中包含的对象的副本进入B,{{1}将执行这些项目的(浅)副本。
initWithDictionary:copyItems:
通常,除非您知道需要复制,否则无需复制。祝你好运!