1

我是一名网页设计师/开发人员,最终决定尝试使用 Objective-C。我坚信标准并遵守一种语言规定的任何指导方针、格式或不成文的规则,而不是试图硬塞我自己的想法应该如何完成或使用我自己的方法(双关语不是有意的,但我会随它去吧)。换句话说,我愿意用camelCaseVarNamesor编写代码underscore_var_names;我只是想知道用所说的语言做事的“普遍接受”的方式是什么。

无论如何,我想知道编写 Objective-C 方法的正确方法——尤其是在扩展现有类时。请注意,我正在采取婴儿步骤,所以我现在不用担心 MVC 设计模式或任何“关注点分离”。我正在使用默认AppDelegate实现文件(是的,我是个坏蛋)。<head>我喜欢认为这相当于在学习 CSS 时在 HTML 文件中编写一堆样式;我只是想看看这个按钮的作用和那个按钮的作用。说得通?

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

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

我遇到的问题是它viewInstance:本身毫无意义,而且从我所读到的,Objective-Cer 的爱 superRichAndDescriptiveMethodNamesThatAreSelfDocumenting。话虽如此,整个方法名称包括第二部分——我假设第二部分是命名参数或参数。因此,当一起阅读时,它实际上是有一点意义的。我正在谈论的一个真实世界的例子是NSColor'colorWithDeviceRed方法。在我意识到这Red:是第一个参数之前,我浏览了弹出的完成列表 20 次!完整的声明是:

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

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

// 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.

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

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 alloc] initWithDictionary:(NSDictionary)]
[[NSDictionary alloc] initWithDictionary:(NSDictionary) copyItems:(bool)]

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

function initWithObject(object, copyItems) {
    var obj = {};
    if ( copyItems ) {
        ...
    }
    return obj;
}

在我的示例中,我将有一个可选参数,当包含该参数时会改变函数的流程。我对这两种方法的事情可能完全错了,但是从我对Objective-C的了解来看,这就是它的样子。但是,我不会因为我是一个小网络婊子而逃跑。是的,我可以让线程进入睡眠状态并编写类似的东西有点可怕NSTerminateNow,但我认为在你们的帮助下,我实际上可以学到一两件事。所以,请教我!

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

4

1 回答 1

1

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

现在 ARC 处理释放/保留,集合的初始化有点遗物,基本上使用“init”格式将返回一个保留的对象,而类方法[NSArray array]将返回一个自动释放的对象。我会使用@[ ]它,因为它简短而清晰。

对于字典实例化问题,用另一个字典初始化一个字典使得 A 中包含的对象现在也包含在 B 中。如果您确实希望 A 中包含的对象的副本进入 B,initWithDictionary:copyItems:将执行(浅)复制那些项目。

NSMutableString *someString = [@"abc" mutableCopy];
NSDictionary *a = @{ @"key" : someString };
NSDictionary *b1 = [[NSDictionary alloc] initWithDictionary:a];
NSDictionary *b2 = [[NSDictionary alloc] initWithDictionary:a copyItems:YES];

[someString appendString:@"def"];
// b1[@"key"] == abcdef
// b2[@"key"] == abc
// Note also that b1[@"key"] will be a mutablestring, b2[@"key"] will not

通常你不需要复制,除非你知道你需要复制。祝你好运!

于 2013-09-19T00:39:45.273 回答