精华内容
下载资源
问答
  • Xbox 360 控制器管理器是 Colin Munro 用于 Mac OS X 的 Xbox 360 控制器驱动程序的 Objective-C 包装器。该项目的目标是让 Mac 应用程序开发人员能够轻松地在他们的应用程序中使用 Xbox 360 控制器输入。 它通过 ...
  • Episode 184 ofThe SitePoint Podcastis now available... This week our regular interview host Louis Simoneau (@rssaddict) interviews Colin Ihrig (@cjihrig) about the new website from Sitepoint called JS...

    Episode 184 of The SitePoint Podcast is now available! This week our regular interview host Louis Simoneau (@rssaddict) interviews Colin Ihrig (@cjihrig) about the new website from Sitepoint called JSPro.com where Colin is the Managing Editor.

    SitePoint Podcast的第184集现已发布! 本周,我们的定期采访主持人Louis Simoneau( @rssaddict )采访了Colin Ihrig( @cjihrig ),讨论了Sitepoint的新网站JSPro.com ,其中Colin是执行编辑。

    下载此剧集 (Download this Episode)

    You can download this episode as a standalone MP3 file. Here’s the link:

    您可以将本集下载为独立的MP3文件。 这是链接:

    • SitePoint Podcast #184: JSPro.com with Colin Ihrig (MP3, 16:05, 15.4MB)

      SitePoint Podcast#184:带有Colin Ihrig的JSPro.com (MP3,16:05,15.4MB)

    剧集摘要 (Episode Summary)

    Louis and Colin talk about the launch of JSPro.com, what it’s aims are immediately, and how it aims to move forward.

    Louis和Colin谈论了JSPro.com的发布,它的目标是什么,以及它如何向前发展。

    Browse the full list of links referenced in the show at http://delicious.com/sitepointpodcast/184.

    浏览http://delicious.com/sitepointpodcast/184中显示的参考链接的完整列表。

    面试成绩单 (Interview Transcript)

    Louis: Hello, and welcome to another episode of the SitePoint Podcast. With me on the show today is the managing editor of SitePoint’s latest content site, which is JSPro.com, Colin Ihrig. Hi, Colin.

    路易斯:您好,欢迎收看SitePoint播客的另一集。 今天和我一起参加展览的是SitePoint最新内容站点的执行编辑,该站点是JSPro.com,Colin Ihrig。 嗨,科林。

    Colin: Hi, Louis.

    科林:嗨,路易斯。

    Louis: Hi, and welcome to the show.

    路易斯:您好,欢迎参加演出。

    Colin: Thanks for having me.

    科林:谢谢你有我。

    Louis: Yeah, so we’ve just launched a new site, really, all about JavaScript. Do you want to talk a little bit about what JSPro is and how you came to be involved in it?

    路易斯:是的,所以我们刚刚启动了一个有关JavaScript的新站点。 您想谈谈JSPro是什么以及如何参与其中吗?

    Colin: Okay, so JSPro is basically the SitePoint network’s new place for everything related to JavaScript. We’re going to be covering things like jQuery, Node.js, native JavaScript — plain old vanilla JavaScript — and just everything on the topic. The way I got involved was I was originally just a writer for SitePoint, and I asked Tom, the editor, “What could I do to be more involved?” And I was originally just planning on writing more articles, but he said, “Oh, well, we have this new site launching. How would you like to work with it?” I said, “Sure.”

    Colin:好的,因此JSPro基本上是SitePoint网络中所有与JavaScript相关的地方。 我们将介绍诸如jQuery,Node.js,本地JavaScript(普通的旧式JavaScript)之类的内容。 我参与其中的方式是我最初只是SitePoint的一名作家,然后我问编辑Tom:“我应该怎么做才能更多地参与其中?” 我本来只是打算写更多文章,但他说:“哦,好了,我们启动了这个新网站。 您想如何使用它?” 我说:“可以。”

    Louis: Right. So I take it you’ve been working with JavaScript for some time?

    路易斯:对。 因此,我认为您使用JavaScript已有一段时间了?

    Colin: I taught myself back in high school and, basically, every job I’ve had since then, I’ve been working with it.

    柯林:我在高中时就自学了,基本上,从那时起我从事的每一项工作,我都一直在从事。

    Louis: Right. One of the things that was surprising to me when I found out that this new site was being launched, I thought, “Oh, yeah, that’s great — a good, new site by JavaScript — that makes sense.” And then I thought to myself, “Well, that’s funny. I don’t know any other sites that spring to mind as a place to go to find tutorials and information by JavaScript.” So there was nothing off the top of my head, but then even when I looked into it, I couldn’t really find anything. So I wonder if it’s maybe just sort of a sign of a new stage in JavaScript’s development that it’s the right time for a site focused on JavaScript? I was thinking things like CoffeeScript and Backbone.js and Node have only been around for a few years, so does it seem to you like now is a good time for this?

    路易斯:对。 当我发现这个新站点正在启动时,令我感到惊讶的是,我想:“哦,是的,太好了-用JavaScript创建一个好的新站点-很有道理。” 然后我心想:“好吧,这很有趣。 我不知道有什么其他网站可作为通过JavaScript查找教程和信息的地方。” 因此,我的头顶上什么都没有,但是即使当我看着它时,我也找不到任何东西。 因此,我想知道这是否是JavaScript开发新阶段的信号,那么现在正是专注于JavaScript的网站的合适时机吗? 我当时想过诸如CoffeeScript和Backbone.js以及Node之类的东西已经存在了几年,所以在您看来现在看来是个好时机吗?

    Colin: Well, I think it’s a combination of a few things. First, for a long time JavaScript had a bad reputation and it was just something that teenagers would put on their websites to make things blink. And second, there are a lot of blogs out there and random websites that have some content, but JavaScript has evolved to the point where there is so much with so many different libraries and everything — client-side, server-side — that to get everything in one place is just really hard, and we need a site that is collective of real people, or working lists such as JSPro.

    柯林:嗯,我认为这是几件事的结合。 首先,很长一段时间以来,JavaScript的声誉都很差,这正是青少年会在他们的网站上放一些东西以使它们闪烁的东西。 其次,那里有很多博客和随机网站,这些网站上都有一些内容,但是JavaScript发展到了如此之地,以至于有如此之多的不同的库,而要获得的所有内容(客户端,服务器端)一个地方的一切都非常困难,我们需要一个由真正的人组成的网站,或者像JSPro这样的工作清单。

    Louis: Yeah, I’m looking forward to seeing the kind of stuff you’ll be covering. Have you worked with Node.js, for example?

    路易斯:是的,我很期待看到您将介绍的内容。 例如,您是否使用过Node.js?

    Colin: Yeah, I have worked with it personally and professionally.

    科林:是的,我个人和专业地使用它。

    Louis: Right. For anyone who’s listening who’s not familiar with Node and what role JavaScript can play on the server, what are the sort of situations you’d want to consider using Node for?

    路易斯:对。 对于不熟悉Node以及不希望JavaScript在服务器上扮演什么角色的正在聆听的人,您想考虑使用Node的哪种情况?

    Colin: Well, Node.js is really great because a lot of people associate it with just servers, but you can do a lot of other stuff with it like run scripts, like shell scripts, instead of having to use DOS or Perl or something like that. But as far as server development is concerned, it’s really good for sites that need a lot of throughput, so something that needs to scale up to tens of thousands of requests per second, because Node.js has a fundamentally different engine under the hood than web servers like a Apache and Microsoft’s offering.

    Colin:好吧,Node.js确实很棒,因为很多人都将它与服务器相关联,但是您可以使用它来做很多其他事情,例如运行脚本(例如Shell脚本),而不必使用DOS或Perl或其他东西。像那样。 但是就服务器开发而言,这对于需要大量吞吐量的站点确实非常有用,因此需要将其每秒扩展到成千上万的请求,因为Node.js的幕后引擎与引擎根本不同。 Web服务器,例如Apache和Microsoft的产品。

    Louis: And for someone who’s coming from a client-side JavaScript background, is it a big shit to start playing with JavaScript on the server- side. Are there a lot of the APIs that are very different?

    路易斯:对于那些来自客户端JavaScript背景的人来说,开始在服务器端使用JavaScript是一件大事。 是否有很多非常不同的API?

    Colin: Well, Node.js has a fairly small core but an awful lot of libraries, so you can go out onto GitHub and find an API guy to do just about anything. And it is still just regular old JavaScript, so you don’t have to learn new syntax or anything like that. And the programming model is all asynchronous and really reminds me of programming for the GUI on client-side. So he presses a button and something happens in the browser window. With Node.js, somebody connects to your server and then something happens, or you connect to a database and then you wait for something else to happen and enable your results to be returned from the query. So it’s a lot different than running VHD. But if you’re familiar with JavaScript on the client’s, not the output.

    Colin:好吧,Node.js的核心很小,但是有很多库,因此您可以使用GitHub并找到可以做任何事情的API专家。 而且它仍然只是常规的旧JavaScript,因此您不必学习新的语法或类似的东西。 而且编程模型都是异步的,确实让我想起了在客户端进行GUI编程的过程。 因此,他按下一个按钮,浏览器窗口中发生了某些事情。 使用Node.js,有人连接到您的服务器,然后发生了某些事情,或者您连接到了数据库,然后等待其他事情发生,并使结果可以从查询中返回。 因此,与运行VHD有很大不同。 但是,如果您熟悉客户端JavaScript,而不是输出。

    Louis: Right. And you mentioned it is plain JavaScript. That sort of leads me into talking about CoffeeScript. Is CoffeeScript something that you’ve worked with?

    路易斯:对。 您提到它是纯JavaScript。 这种引导使我开始谈论CoffeeScript。 您正在使用CoffeeScript吗?

    Colin: I haven’t worked with it. I’ve read a few articles that we’ve been posting on JSPro. Personally, I don’t really care for the compounded JavaScript languages, but that’s a personal thing.

    科林:我还没有合作。 我读了一些我们在JSPro上发布的文章。 就个人而言,我并不真正在乎复合JavaScript语言,但这是个人的事情。

    Louis: Yeah, I’ve sort of been the same. I always look at it and think, well, it’s sort of pretty, but JavaScript isn’t really that hard. I don’t find that typing those curly braces is really eating into my time that much.

    路易斯:是的,我有点一样。 我一直在看它,并认为它不错,但是JavaScript并不是那么难。 我发现键入这些花括号并不会真的让我吃那么多时间。

    Colin: For me it’s also a matter of, you write your CoffeeScript and then you’ll most likely compile it into JavaScript. And if there’s a bug and you need to debug the JavaScript somehow, you’re going to need the Node anyway, so.

    Colin:对我来说,这也是一个问题,编写CoffeeScript,然后很可能将其编译为JavaScript。 而且,如果存在错误,并且您需要以某种方式调试JavaScript,则无论如何都将需要Node。

    Louis: Yeah.

    路易斯:是的。

    Colin: And like you said, it’s not the toughest language to learn, at least not the basics.

    柯林:就像你说的那样,这不是最难学的语言,至少不是基础知识。

    Louis: Right. So you mentioned that there is already a fair bit of content up on JSPro. What are some of the pieces that you’ve liked the most or that you’ve had fun working with in your first little while as managing editor?

    路易斯:对。 因此,您提到了JSPro上已经有很多内容。 您最喜欢的哪些作品是什么,或者在担任总编辑的头几年中,有哪些有趣的作品?

    Colin: Right. So we’ve been up for, I think, around two weeks now, and I’ve been working with a couple of authors: one guy, James Edwards — he goes by “Brothercake”. He is doing some really good work on modular design and things like that, and in the next coming weeks we’re going to have a five- part series from another author, Jeff Pereason… Sorry, I’m pronouncing his name wrong, but he’s going to be, basically, developing an HTML5 game with submarines and missiles and torpedoes — it’s really cool. So, you should be on the look out for that.

    科林:对。 因此,我认为大约两个星期以来,我们一直在努力,我一直在与几个作者合作:一个人,詹姆斯·爱德华兹(James Edwards),他的名字叫“兄弟蛋糕”。 他在模块化设计等方面做得非常出色,在接下来的几周内,我们将出版另一作者Jeff Pereason撰写的由五个部分组成的系列文章……对不起,我的名字错了,但是基本上,他将使用潜艇,导弹和鱼雷来开发HTML5游戏-确实很棒。 因此,您应该注意这一点。

    Louis: Right. I know there are quite a number of libraries that exist for HTML5 Canvas games. Is this something that’s he’s doing from scratch directly with the Canvas API, or is he working with some kind of library?

    路易斯:对。 我知道有很多HTML5 Canvas游戏库。 这是他直接使用Canvas API从头开始做的事情,还是他正在使用某种库?

    Colin: I believe he’s working with jQuery.

    Colin:我相信他正在使用jQuery。

    Louis: Right, but nothing game-specific?

    路易斯:对,但是没有特定于游戏的内容吗?

    Colin: I don’t think so, no.

    科林:我不这么认为,不。

    Louis: Right. While I’m on the topic of frameworks or libraries, is there anything in terms of JavaScript frameworks or libraries that you’ve encountered recently and that you thought were pretty cool?

    路易斯:对。 当我讨论框架或库的话题时,您最近遇到过关于JavaScript框架或库的事情吗,您认为这很酷吗?

    Colin: A lot of what I’ve been working with recently has been Cheerio, which I don’t believe is very new.

    Colin:最近与我合作的很多东西都是Cheerio,我认为这不是很新。

    Louis: It’s new to me. It’s new to me.

    路易:对我来说是新的。 对我来说是新的。

    Colin: Yeah, so if you’re not familiar with Cheerio, it’s basically jQuery for Node.js. So, say you’re doing web scraping and you’re going out and pulling in all these webpages into your server to parse them instead of trying to use regular expressions or whatever else you would try, you can build up the dorm and then query using the same selectors as you would on the client-side with jQuery.

    Colin:是的,因此,如果您不熟悉Cheerio,则基本上是用于Node.js的jQuery。 因此,假设您正在执行Web抓取,并且要出去并将所有这些网页拉入服务器以解析它们,而不是尝试使用正则表达式或其他任何尝试,则可以构建宿舍然后查询使用与在jQuery客户端上相同的选择器。

    Louis: All right. This is cool. I just pulled it up from the GitHub page. And it can also do, I think, in-place editing of the HTML, as well?

    路易斯:好的。 这很酷。 我只是从GitHub页面中提取了它。 我认为它也可以就地编辑HTML吗?

    Colin: Yes.

    科林:是的。

    Louis: So it does the same manipulation options as jQuery?

    路易斯:那么它和jQuery有相同的操作选项吗?

    Colin: Yeah. So what I’ve found is that it’s not quite as robust as jQuery, but it’s pretty good and it’s not nearly as old, so I think it’s only going to get better.

    科林:是的。 因此,我发现它的功能不如jQuery强大,但它还不错,而且还不及jQuery的那么旧,所以我认为它只会变得更好。

    Louis: Right. Is it HTML only or would it work with XML as well? Or is that maybe something that they’re planning?

    路易斯:对。 它是仅HTML还是可以与XML一起使用? 或者这也许是他们正在计划的事情?

    Colin: I haven’t tried it with XML. I know that it doesn’t parse your JavaScript for you, so I’ve been doing a lot of web scraping lately, and when it comes time to actually parse JavaScript, you either kind of have to go towards another module called VM, which you can parse JavaScript in and execute it. It’s kind of like an eval function but nicer. And at the total opposite end of the spectrum is, I’ve been using headless browsers. It’s called PhantomJS and it’s basically a webkit, except without the GUI, so you can do just about anything with that.

    Colin:我还没有尝试过XML。 我知道它不会为您解析JavaScript,因此最近我一直在进行大量Web抓取,并且当需要实际解析JavaScript时,您要么必须使用另一个称为VM的模块,您可以解析JavaScript并执行它。 这有点像评估函数,但更好。 总而言之,我一直在使用无头浏览器。 它被称为PhantomJS,基本上是一个Webkit,除了没有GUI之外,因此您几乎可以执行任何操作。

    Louis: Yeah, I’m familiar with PhantomJS. We use it for a few things, one of which is just running JavaScript tests in a headless mode.

    路易斯:是的,我对PhantomJS很熟悉。 我们将它用于几件事,其中之一就是以无头模式运行JavaScript测试。

    Colin: I like it so far.

    柯林:到目前为止,我很喜欢。

    Louis: Yeah. I was on the Cheerio GitHub page, and it does mention that it can parse XML documents as well. So that’s definitely interesting. I’ll put a link to the GitHub page in the show notes. Cool. Another thing I wanted to talk to you a little about is one of the pieces that you wrote on JSPro, which was referring to, I think, a new JavaScript API that’s being added to some browsers, which is the navigation timing API.

    路易斯:是的。 我在Cheerio GitHub页面上,它确实提到它也可以解析XML文档。 因此,这绝对是有趣的。 我将在展示笔记中链接到GitHub页面。 凉。 我想与您讨论的另一件事是您在JSPro上编写的文章之一,我认为这是指正在向某些浏览器添加的新JavaScript API,即导航计时API。

    Colin: Right, right. Originally, I wrote that article for SitePoint. This was back when I was just a writer. And we did content for JSPro for the national launch so we took that and published it on JSPro. The API itself is useful not as much for the webpage experience for the client, but for the developer to see what’s going on with page loads. Until those APIs came around, a lot of people were using date comparisons, which have a lot of drawbacks, for example: JavaScript timing is notoriously inaccurate, but also, we can only time so much of it because you only have from the point that JavaScript loads until the page finishes loading to really test your load times. You have no idea about what’s going on server requests and DNS lookups and things like that. So the navigation timing API is built directly into the browser and it gives you much more fine-grained control over timing numbers.

    科林:对,对。 最初,我为SitePoint撰写了该文章。 那时我还只是个作家。 我们为全国发行的JSPro制作了内容,因此我们接受了该内容并将其发布在JSPro上。 对于客户端的网页体验,API本身并没有多大用处,但对于开发人员来说,看看页面加载发生了什么是非常有用的。 在这些API出现之前,很多人都在使用日期比较,这有很多缺点,例如:JavaScript计时众所周知是不准确的,但是,我们只能安排这么多时间,因为从这个角度来看, JavaScript会加载,直到页面加载完成才能真正测试您的加载时间。 您不知道服务器请求和DNS查找等方面的情况。 因此,导航计时API直接内置于浏览器中,它使您可以更精确地控制计时编号。

    Louis: Right. So does that give you access to a lot of the same information you would normally get by looking at the network tab, like the developer tools in Chrome, for example?

    路易斯:对。 那么,这是否使您可以访问通常通过查看“网络”标签可以获得的许多相同信息,例如Chrome中的开发人员工具?

    Colin: Yeah, pretty much, except this lets you play with it programmatically, and it’s not going to be Chrome-specific.

    Colin:是的,除了它可以让您以编程方式使用它,而且它不会特定于Chrome。

    Louis: Right. I’m just having a look down at the list of events which are available — it’s pretty extensive. How fine-grained is it, for example? Can I look at load times for each of the images that are requested as part of the page load, or is it more for the page as a whole?

    路易斯:对。 我只是看一下可用的事件列表-范围很广。 例如,它的粒度如何? 我可以查看页面加载过程中请求的每个图像的加载时间,还是整个页面都更长?

    Colin: It’s more for the page as a whole.

    Colin:整个页面的意义更大。

    Louis: Right. And so in practice, I guess, what you might use is… Rather than doing all of your debug locally and saying, “Well, it looks fast from where I’m sitting,” you could, for example, include some code using this API for some of your users and then report back to the server to see what the performance is like for your site in the wild?

    路易斯:对。 因此,在实践中,我想您可能会使用……而不是在本地进行所有调试,而是说:“嗯,从我坐着的地方看起来很快”,例如,您可以使用一些代码为某些用户提供API,然后向服务器报告,以了解您的网站在野外的性能如何?

    Colin: Yeah, exactly, because when you’re testing your own page, you’re usually near the server or behind the corporate network. When things go into the wild, any number of things can happen. So this allows you to get a lot more reporting just from somebody on the other side of the world running your site in Firefox as opposed to you running it locally in Chrome.

    Colin:是的,因为在测试自己的页面时,通常是在服务器附近或公司网络后面。 当事情变得疯狂时,任何事情都会发生。 因此,这使您可以从世界另一端的人那里获得更多报告,而不是在Chrome中本地运行。

    Louis: Right. What is the browser support like for this API at the moment?

    路易斯:对。 目前该API对浏览器的支持是什么?

    Colin: Oh, I wrote that article a few months ago, so I’d have to look it up on caniuse.com, right now.

    Colin:哦,我几个月前写了那篇文章,所以我现在必须在caniuse.com上查找它。

    Louis: Right. Here we are. Just pulled it up. Looks like IE from 9, all the modern Firefox and Chrome, Android from 4, Blackberry 10, and Chrome and Firefox for Android. So it’s missing in Opera and Safari and iOS Safari at the moment. I guess IE 8 as well, but IE 8 doesn’t count.

    路易斯:对。 我们来了。 刚拉起来。 看起来像来自9的IE,所有现代Firefox和Chrome,来自4的Android,Blackberry 10以及适用于Android的Chrome和Firefox。 因此,目前Opera和Safari以及iOS Safari中都缺少它。 我想IE 8也一样,但IE 8不算在内。

    Colin: I think that’s pretty good support. I mean, any time you can get Internet Explorer working, that’s always a plus.

    科林:我认为这是很好的支持。 我的意思是,只要您能使Internet Explorer正常运行,那总是一个加号。

    Louis: So I see there’s more content being published on JSPro, pretty much daily? What’s the current schedule looking like?

    路易斯:所以我看到几乎每天都有更多内容发布在JSPro上? 目前的时间表是怎样的?

    Colin: The current schedule is Monday, Wednesday, Friday, and Saturday.

    柯林:目前的时间表是星期一,星期三,星期五和星期六。

    Louis: Right. And I also understand you’re still on the lookout for authors, as well?

    路易斯:对。 而且我也了解您也还在寻找作者?

    Colin: Yeah, definitely. We’re always looking for more content and more authors. Just go to JSPro.com, scroll down to the bottom of the page and click on the “Become an Author” link, and it will have all the instructions you need for, basically, getting in touch with me, and we’ll go from there. If we think you’re a good enough writer, then we send over an article and if you’re accepted, then welcome to the team.

    科林:是的,当然。 我们一直在寻找更多的内容和更多的作者。 只需转到JSPro.com,向下滚动到页面底部,然后单击“成为作者”链接,它将获得您需要的所有说明,基本上可以与我联系,我们将继续从那里。 如果我们认为您足够优秀,请发送文章,如果您被接受,则欢迎加入团队。

    Louis: Right. And is there anything in particularly you’re looking for? Is it pretty much anything to do with JavaScript as go?

    路易斯:对。 并且有什么特别需要的吗? 几乎与JavaScript无关吗?

    Colin: Yeah. Obviously, it has to be related to JavaScript, but there’s a side menu on our page: jQuery, APIs, Tools and Libraries, Engines, Node.js — we’re looking for all that stuff and more. In particular, right now, personally, I would like an introduction to jQuery article. I have a couple of people sending me articles covering how to write games and how to write plug-ins but nothing on how to get started, so that would be great. I have a couple of people sending me requests for Node.js but, like I said earlier, there’s a ton of different libraries out there, so definitely looking for more stuff on Node.js. And just anything I haven’t covered, we’re still looking for it.

    科林:是的。 显然,它必须与JavaScript相关,但是我们页面上有一个侧面菜单:jQuery,API,工具和库,引擎,Node.js-我们正在寻找所有这些东西以及更多东西。 特别是现在,个人而言,我想对jQuery文章进行介绍。 我有几个人给我发了文章,内容涉及如何编写游戏和如何编写插件,但没有关于如何入门的文章,所以那太好了。 我有几个人向我发送对Node.js的请求,但是,就像我前面说的那样,那里有很多不同的库,因此肯定在Node.js上寻找更多的东西。 以及我没有涉及的任何内容,我们仍在寻找它。

    Louis: All right. Yeah, so again, anyone who wants to check that out, the address is JSPro.com. And like you said, the link to become an author is at the bottom of the page. I might put a link to that in the show nuts as well.

    路易斯:好的。 是的,同样,任何想查看的人都是JSPro.com。 就像您说的那样,成为作者的链接位于页面底部。 我可能还会在展示螺母中添加一个链接。

    Colin: Just one last thing. If you’re interested, if you’re a reader, on the right side of the page is a box for you to subscribe to our newsletter that’s going to start within the next couple of weeks, so sign up.

    科林:最后一件事。 如果您有兴趣,如果您是读者,那么在页面右侧会显示一个框,供您订阅我们的新闻通讯,该通讯将在接下来的几周内开始,因此请注册。

    Louis: All right. Well, thanks a lot, Colin, for taking the time to talk to me this week. If any of the listeners want to keep up with you, do you have your own blog or Twitter, or are you exclusively on JSPro.com at the moment?

    路易斯:好的。 好吧,非常感谢Colin,本周花时间与我交谈。 如果有任何听众希望与您保持联系,您是否拥有自己的博客或Twitter,或者目前仅在JSPro.com上使用?

    Colin: I have my own blog. It’s www.cjihrig.com. And I’m also on Twitter: cjihrig. My author link on JSPro should have all that information if you’re interested in following me.

    科林:我有自己的博客。 是www.cjihrig.com。 我也在Twitter上:cjihrig。 如果您有兴趣关注我,我在JSPro上的作者链接应该包含所有这些信息。

    Louis: All right. Well, thanks again, Colin.

    路易斯:好的。 好吧,再次感谢Colin。

    Colin: Thanks for having me.

    科林:谢谢你有我。

    Louis: And thanks for listening to this week’s episode of the SitePoint Podcast. I’d love to hear what you thought about today’s show, so if you have any thoughts or suggestions just go to sitepoint.com/podcast and you can leave a comment on today’s episode, you can also get any of our previous episodes to download or subscribe to get the show automatically. You can follow SitePoint on Twitter @sitepointdotcom, that’s sitepoint d-o-t-c-o-m, and you can follow me on Twitter @rssaddict. The show this week was produced by Karn Broad, and I’m Louis Simoneau, thanks for listening and bye for now.

    路易斯:感谢您收听本周的SitePoint播客。 我很想听听您对今天节目的看法,因此,如果您有任何想法或建议,请访问sitepoint.com/podcast ,您可以对今天的节目发表评论,也可以下载我们以前的任何节目或订阅自动显示节目。 您可以在Twitter @sitepointdotcom (即站点点dotcom)上关注SitePoint ,也可以在Twitter @rssaddict上关注我。 本周的节目是由Karn Broad制作的,我是Louis Simoneau,感谢您的收听和再见。

    Audio Transcription by SpeechPad.

    通过SpeechPad进行音频转录

    Theme music by Mike Mella.

    Mike Mella的主题音乐。

    Thanks for listening! Feel free to let us know how we’re doing, or to continue the discussion, using the comments field below.

    谢谢收听! 欢迎使用下面的评论字段让我们知道我们的状况,或者继续讨论。

    翻译自: https://www.sitepoint.com/sitepoint-podcast-184-jspro-com-with-colin-ihrig/

    展开全文
  • Object-C是一门基于C语言开发而来的面向对象的编程语言,它增加了Small Talk编程语言的功能,主要用于开发iOS和Mac OS X操作系统及其应用程序。Object-C完全支持面向对象的编程,当然包括面向对象开发的四大特性: ...

           由于项目上的原因,需要进行Mac OS平台上的上位机开发(内心os🗣: 我是个嵌入式软件开发的小伙子啊),上一个project结束后,就赶鸭子上Mac OS,虽然只是临时的活,不过还是为此拿起了平时没怎么注意的名为《Objective-C基础教程》的书籍。Mac OS是苹果的专用的系统,是一种基于Unix内核的图形化操作系统。进行Mac OS的软件开发需要接触和熟悉的主要有以下几点:Objective-C、Xcode IDE、Cocoa等(不足之处敬请补充),姑且就叫做Mac OS开发的三驾马车吧🤔。

            Objective-C则是一门基于C语言开发而来的面向对象的编程语言,它增加了Small Talk编程语言的功能,主要用于开发iOS和Mac OS X操作系统及其应用程序。说到Objective-C就不得不提一下其和C语言之间的关系,Objective-C是C语言的严格超集,即任何C语言程序都能够不经过任何修饰直接通过Objective-C的编译器,其完全支持面向对象的编程,当然包括面向对象开发的四大特性:

    • 封装
    • 数据隐藏
    • 继承
    • 多态性

    基本框架:

        Foundation Framework提供了大量的函数功能;

    • 它包括一个拓展数据类型的列表,如:NSArray,NSDictionary、NSSet等;
    • 它由一组丰富的函数组成,用于处理文件、字符串等。
    • 它提供了URL处理功能,日期格式化、数据处理、错误处理等实用功能。

    开发环境:

           使用Xcode作为开发环境进行Coding,该IDE支持C、Object-C、C++等多种编程语言。

            关于Xcode,做Mac OS/iOS开发的小伙子们肯定再熟悉不过来,Xcode是Apple的集成开发环境(IDE)。 使用Xcode可为Apple产品构建应用程序,包括iPad,iPhone,Apple Watch,Apple TV和Mac。 Xcode提供了用于管理整个开发工作流程的工具-从创建应用程序到测试,优化并将其提交到App Store。贴一个苹果开发者官方的关于Xcode使用的介绍以及方法的传送门:

    https://help.apple.com/xcode/mac/current/#/

            Cocoa是啥子类?

    这个东西我没办法和你解释,因为我只是一只小白兔

             援引苹果开发者网站的介绍如下:

             https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Cocoa.html

             Cocoa and Cocoa Touch are the application development environments for OS X and iOS, respectively. Both Cocoa and Cocoa Touch include the Objective-C runtime and two core frameworks:

    • Cocoa, which includes the Foundation and AppKit frameworks, is used for developing applications that run on OS X.
    • Cocoa Touch, which includes Foundation and UIKit frameworks, is used for developing applications that run on iOS.

             翻译之则为:Cocoa是OS X的应用程序开发环境。 Cocoa包含Objective-C运行时和两个核心框架:Cocoa(包括Foundation和AppKit框架)用于开发在OS X上运行的应用程序。

     

            接下来会以一个小专栏的形式,就基本的语法知识、常用的编程技巧,再到项目实战(如何写个小工具软件之类的),进行一些个人的分享。预计是会一周一更,毕竟社畜是不允许加班的,不知不觉成为社畜也快一个年头了,手动狗头

    推荐一些学习的网站:

    CocoaChina:http://www.cocoachina.com

    易百教程:https://www.yiibai.com/objective_c

    菜鸟教程:https://www.runoob.com/w3cnote/objective-c-tutorial.html

    苹果开发者:https://developer.apple.com

    书籍:《Objective-C基础教程》-Mark Dalrymple , Scott Knaster (作者) 高朝勤 , 杨越 , 刘霞 (译者)

     


    为接下来的内容的目录留一块地皮👷

     

     

     

    展开全文
  • 1 安装Eclipse 在Terminal中输入以下命令...2 配置C/C++开发环境 使用如下命令: sudo apt -get install build -essential sudo apt -get install eclipse -cdt 重启Eclipse即可创建C/C++项目进行测试了。

    1 安装Eclipse
    在Terminal中输入以下命令测试是否安装了Eclipse:

    eclipse

    如果没有安装,系统会提示你使用什么命令去安装eclipse,如下命令即可安装所需要的JDK等其他依赖关系:

    sudo apt install eclipse-platform

    此时安装完的Eclipse应该是默认隐藏了菜单栏的,参考Ubuntu中Eclipse的菜单栏显示问题即可。

    sudo gedit /etc/profile

    在文件最后添加export UBUNTU_MENUPROXY=0 保存并重启系统即可。

    2 配置C/C++开发环境
    使用如下命令:

    sudo apt-get install build-essential
    sudo apt-get install eclipse-cdt

    重启Eclipse即可创建C/C++项目进行测试了。

    展开全文
  • 本文出处程序员头条:http://www.90159.com/2015/06/17/Objective-C编码规范:26个方面解决iOS开发问题/  转载请在开头注明本文出处。 介绍 我们制定Objective-C编码规范的原因是我们能够在我们的书,教程和...

    本文出处程序员头条:http://www.90159.com/2015/06/17/Objective-C编码规范:26个方面解决iOS开发问题/ 
    转载请在开头注明本文出处。

    介绍

    我们制定Objective-C编码规范的原因是我们能够在我们的书,教程和初学者工具包的代码保持优雅和一致。即使我们有很多不同的作者来完成不同的书籍。

    这里编码规范有可能与你看到的其他Objective-C编码规范不同,因为它主要是为了打印和Web的易读性。

    关于作者

    这编码规范的创建是由很多来自raywenderlich.com团队成员在Nicholas Waynik的带领下共同完成的。团队成员有:Soheil Moayedi Azarpour、Ricardo Rendon Cepeda、Tony Dahbura、Colin Eberhardt、Matt Galloway、Greg Heo、Matthijs Hollemans、Christopher LaPollo、Saul Mora、Andy Pereira、Mic Pringle、Pietro Rea、Cesare Rocchi、Marin Todorov、Nicholas Waynik和Ray Wenderlich。

    我们也非常感谢New York Times 和Robots & Pencils’Objective-C编码规范的作者。这两个编码规范为本指南的创建提供很好的起点。

    背景

    这里有些关于编码风格Apple官方文档,如果有些东西没有提及,可以在以下文档来查找更多细节:

    语言

    应该使用US英语。

    应该:

    UIColor *myColor = [UIColor whiteColor];  
    

    不应该:

    UIColor *myColour = [UIColor whiteColor];  
    

    代码组织

    在函数分组和protocol/delegate实现中使用#pragma mark -来分类方法,要遵循以下一般结构:

    #pragma mark - Lifecycle  
    - (instancetype)init {}  
    - (void)dealloc {}  
    - (void)viewDidLoad {}  
    - (void)viewWillAppear:(BOOL)animated {}  
    - (void)didReceiveMemoryWarning {}  
    #pragma mark - Custom Accessors  
    - (void)setCustomProperty:(id)value {}  
    - (id)customProperty {}  
    #pragma mark - IBActions  
    - (IBAction)submitData:(id)sender {}  
    #pragma mark - Public  
    - (void)publicMethod {}  
    #pragma mark - Private  
    - (void)privateMethod {}  
    #pragma mark - Protocol conformance  
    #pragma mark - UITextFieldDelegate  
    #pragma mark - UITableViewDataSource  
    #pragma mark - UITableViewDelegate  
    #pragma mark - NSCopying  
    - (id)copyWithZone:(NSZone *)zone {}  
    #pragma mark - NSObject  
    - (NSString *)description {}  
    

    空格

    • 缩进使用4个空格,确保在Xcode偏好设置来设置。(raywenderlich.com使用2个空格)
    • 方法大括号和其他大括号(if/else/switch/while 等.)总是在同一行语句打开但在新行中关闭。

    应该:

    if (user.isHappy) {  
        //Do something  
    } else {  
        //Do something else  
    }  
    

    不应该:

    if (user.isHappy)  
    {  
      //Do something  
    }  
    else {  
      //Do something else  
    }  
    
    • 在方法之间应该有且只有一行,这样有利于在视觉上更清晰和更易于组织。在方法内的空白应该分离功能,但通常都抽离出来成为一个新方法。
    • 优先使用auto-synthesis。但如果有必要,@synthesize和@dynamic应该在实现中每个都声明新的一行。
    • 应该避免以冒号对齐的方式来调用方法。因为有时方法签名可能有3个以上的冒号和冒号对齐会使代码更加易读。请不要这样做,尽管冒号对齐的方法包含代码块,因为Xcode的对齐方式令它难以辨认。

    应该:

    // blocks are easily readable  
    [UIView animateWithDuration:1.0 animations:^{  
      // something  
    } completion:^(BOOL finished) {  
      // something  
    }];  
    

    不应该:

    // colon-aligning makes the block indentation hard to read  
    [UIView animateWithDuration:1.0  
                     animations:^{  
                         // something  
                     }  
                     completion:^(BOOL finished) {  
                         // something  
                     }];  
    

    注释

    当需要注释时,注释应该用来解释这段特殊代码为什么要这样做。任何被使用的注释都必须保持最新或被删除。

    一般都避免使用块注释,因为代码尽可能做到自解释,只有当断断续续或几行代码时才需要注释。例外:这不应用在生成文档的注释

    关注iOS开发iOSDevTip,回复“资料”即可下载2000G编程资料。

    命名

    Apple命名规则尽可能坚持,特别是与这些相关的memory management rules (NARC)。

    长的,描述性的方法和变量命名是好的。

    应该:

    UIButton *settingsButton;  
    

    不应该:

    UIButton *setBut;  
    

    三个字符前缀应该经常用在类和常量命名,但在Core Data的实体名中应被忽略。对于官方的raywenderlich.com书、初学者工具包或教程,前缀’RWT’应该被使用。

    常量应该使用驼峰式命名规则,所有的单词首字母大写和加上与类名有关的前缀。

    应该:

    static NSTimeInterval const RWTTutorialViewControllerNavigationFadeAnimationDuration = 0.3;  
    

    不应该:

    static NSTimeInterval const fadetime = 1.7;  
    

    属性也是使用驼峰式,但首单词的首字母小写。对属性使用auto-synthesis,而不是手动编写@synthesize语句,除非你有一个好的理由。

    应该:

    @property (strong, nonatomic) NSString *descriptiveVariableName;  
    

    不应该:

    id varnm;  
    

    下划线

    当使用属性时,实例变量应该使用self.来访问和改变。这就意味着所有属性将会视觉效果不同,因为它们前面都有self.。

    但有一个特例:在初始化方法里,实例变量(例如,_variableName)应该直接被使用来避免getters/setters潜在的副作用。

    局部变量不应该包含下划线。

    方法

    在方法签名中,应该在方法类型(-/+ 符号)之后有一个空格。在方法各个段之间应该也有一个空格(符合Apple的风格)。在参数之前应该包含一个具有描述性的关键字来描述参数。

    “and”这个词的用法应该保留。它不应该用于多个参数来说明,就像initWithWidth:height以下这个例子:

    应该:

    - (void)setExampleText:(NSString *)text image:(UIImage *)image;  
    - (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;  
    - (id)viewWithTag:(NSInteger)tag;  
    - (instancetype)initWithWidth:(CGFloat)width height:(CGFloat)height;  
    

    不应该:

    -(void)setT:(NSString *)text i:(UIImage *)image;  
    - (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;  
    - (id)taggedView:(NSInteger)tag;  
    - (instancetype)initWithWidth:(CGFloat)width andHeight:(CGFloat)height;  
    - (instancetype)initWith:(int)width and:(int)height;  // Never do this.  
    

    变量

    变量尽量以描述性的方式来命名。单个字符的变量命名应该尽量避免,除了在for()循环。

    星号表示变量是指针。例如:
    NSString *text 

    既不是 NSString* text 

    也不是 NSString * text,除了一些特殊情况下常量。

    私有变量应该尽可能代替实例变量的使用。尽管使用实例变量是一种有效的方式,但更偏向于使用属性来保持代码一致性。

    通过使用’back’属性(_variable,变量名前面有下划线)直接访问实例变量应该尽量避免,除了在初始化方法(init, initWithCoder:, 等…),dealloc 方法和自定义的setters和getters。想了解关于如何在初始化方法和dealloc直接使用Accessor方法的更多信息,查看这里。

    应该:

    @interface RWTTutorial : NSObject  
    @property (strong, nonatomic) NSString *tutorialName;  
    @end  
    

    不应该:

    @interface RWTTutorial : NSObject {  
      NSString *tutorialName;  
    }  
    

    属性特性

    所有属性特性应该显式地列出来,有助于新手阅读代码。属性特性的顺序应该是storage、atomicity,与在Interface Builder连接UI元素时自动生成代码一致。

    应该:

    @property (weak, nonatomic) IBOutlet UIView *containerView;  
    @property (strong, nonatomic) NSString *tutorialName;  
    

    不应该:

    @property (nonatomic, weak) IBOutlet UIView *containerView;  
    @property (nonatomic) NSString *tutorialName;  
    

    NSString应该使用copy而不是strong的属性特性。

    为什么?即使你声明一个NSString的属性,有人可能传入一个NSMutableString的实例,然后在你没有注意的情况下修改它。

    应该:

    @property (copy, nonatomic) NSString *tutorialName;  
    

    不应该:

    @property (strong, nonatomic) NSString *tutorialName;  
    

    点符号语法

    点语法是一种很方便封装访问方法调用的方式。当你使用点语法时,通过使用getter或setter方法,属性仍然被访问或修改。想了解更多,阅读: https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html

    点语法应该总是被用来访问和修改属性,因为它使代码更加简洁。[]符号更偏向于用在其他例子。

    应该:

    objc  
    NSInteger arrayCount = [self.array count];  
    view.backgroundColor = [UIColor orangeColor];  
    [UIApplication sharedApplication].delegate;  
    

    不应该:

    NSInteger arrayCount = self.array.count;  
    [view setBackgroundColor:[UIColor orangeColor]];  
    UIApplication.sharedApplication.delegate;  
    

    字面值

    NSString、NSDictionary、NSArray和NSNumber的字面值应该在创建这些类的不可变实例时被使用。请特别注意nil值不能传入NSArray和NSDictionary字面值,因为这样会导致crash。

    应该:

    NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];  
    NSDictionary *productManagers = @{@"iPhone": @"Kate", @"iPad": @"Kamal", @"Mobile Web": @"Bill"};  
    NSNumber *shouldUseLiterals = @YES;  
    NSNumber *buildingStreetNumber = @10018;  
    

    不应该:

    NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil];  
    NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"Kate", @"iPhone", @"Kamal", @"iPad", @"Bill", @"Mobile Web", nil];  
    NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];  
    NSNumber *buildingStreetNumber = [NSNumber numberWithInteger:10018];  
    

    常量

    常量是容易重复被使用和无需通过查找和代替就能快速修改值。常量应该使用static来声明而不是使用#define,除非显式地使用宏。

    应该:

    static NSString * const RWTAboutViewControllerCompanyName = @"RayWenderlich.com";  
    static CGFloat const RWTImageThumbnailHeight = 50.0;  
    

    不应该:

    #define CompanyName @"RayWenderlich.com"  
    #define thumbnailHeight 2  
    

    枚举类型

    当使用enum时,推荐使用新的固定基本类型规格,因为它有更强的类型检查和代码补全。现在SDK有一个宏NS_ENUM()来帮助和鼓励你使用固定的基本类型。

    例如:

    typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType) {  
      RWTLeftMenuTopItemMain,  
      RWTLeftMenuTopItemShows,  
      RWTLeftMenuTopItemSchedule  
    };  
    

    你也可以显式地赋值(展示旧的k-style常量定义):

    typedef NS_ENUM(NSInteger, RWTGlobalConstants) {  
      RWTPinSizeMin = 1,  
      RWTPinSizeMax = 5,  
      RWTPinCountMin = 100,  
      RWTPinCountMax = 500,  
    };  
    

    旧的k-style常量定义应该避免除非编写Core Foundation C的代码。

    不应该:

    enum GlobalConstants {  
      kMaxPinSize = 5,  
      kMaxPinCount = 500,  
    };  
    

    Case语句

    大括号在case语句中并不是必须的,除非编译器强制要求。当一个case语句包含多行代码时,大括号应该加上。

    switch (condition) {  
      case 1:  
        // ...  
        break;  
      case 2: {  
        // ...  
        // Multi-line example using braces  
        break;  
      }  
      case 3:  
        // ...  
        break;  
      default:   
        // ...  
        break;  
    }  
    

    有很多次,当相同代码被多个cases使用时,一个fall-through应该被使用。一个fall-through就是在case最后移除’break’语句,这样就能够允许执行流程跳转到下一个case值。为了代码更加清晰,一个fall-through需要注释一下。

    switch (condition) {  
      case 1:  
        // ** fall-through! **  
      case 2:  
        // code executed for values 1 and 2  
        break;  
      default:   
        // ...  
        break;  
    }  
    

    当在switch使用枚举类型时,’default’是不需要的。例如:

    RWTLeftMenuTopItemType menuType = RWTLeftMenuTopItemMain;  
    switch (menuType) {  
      case RWTLeftMenuTopItemMain:  
        // ...  
        break;  
      case RWTLeftMenuTopItemShows:  
        // ...  
        break;  
      case RWTLeftMenuTopItemSchedule:  
        // ...  
        break;  
    }  
    

    私有属性

    私有属性应该在类的实现文件中的类扩展(匿名分类)中声明,命名分类(比如RWTPrivate或private)应该从不使用除非是扩展其他类。匿名分类应该通过使用+Private.h文件的命名规则暴露给测试。

    例如:

    @interface RWTDetailViewController ()  
    @property (strong, nonatomic) GADBannerView *googleAdView;  
    @property (strong, nonatomic) ADBannerView *iAdView;  
    @property (strong, nonatomic) UIWebView *adXWebView;  
    @end  
    

    布尔值

    Objective-C使用YES和NO。因为true和false应该只在CoreFoundation,C或C++代码使用。既然nil解析成NO,所以没有必要在条件语句比较。不要拿某样东西直接与YES比较,因为YES被定义为1和一个BOOL能被设置为8位。

    这是为了在不同文件保持一致性和在视觉上更加简洁而考虑。

    应该:

    if (someObject) {}  
    if (![anotherObject boolValue]) {}  
    

    不应该:

    if (someObject == nil) {}  
    if ([anotherObject boolValue] == NO) {}  
    if (isAwesome == YES) {} // Never do this.  
    if (isAwesome == true) {} // Never do this.  
    

    如果BOOL属性的名字是一个形容词,属性就能忽略”is”前缀,但要指定get访问器的惯用名称。例如:

    @property (assign, getter=isEditable) BOOL editable;  
    

    文字和例子从这里引用Cocoa Naming Guidelines。

    条件语句

    条件语句主体为了防止出错应该使用大括号包围,即使条件语句主体能够不用大括号编写(如,只用一行代码)。这些错误包括添加第二行代码和期望它成为if语句;还有,even more dangerous defect可能发生在if语句里面一行代码被注释了,然后下一行代码不知不觉地成为if语句的一部分。除此之外,这种风格与其他条件语句的风格保持一致,所以更加容易阅读。

    应该:

    if (!error) {  
      return success;  
    }  
    

    不应该:

    if (!error)  
      return success;  
    

    if (!error) return success;  
    

    三元操作符

    当需要提高代码的清晰性和简洁性时,三元操作符?:才会使用。单个条件求值常常需要它。多个条件求值时,如果使用if语句或重构成实例变量时,代码会更加易读。一般来说,最好使用三元操作符是在根据条件来赋值的情况下。

    Non-boolean的变量与某东西比较,加上括号()会提高可读性。如果被比较的变量是boolean类型,那么就不需要括号。

    应该:

    NSInteger value = 5;  
    result = (value != 0) ? x : y;  
    BOOL isHorizontal = YES;  
    result = isHorizontal ? x : y;  
    

    不应该:

    result = a > b ? x = c > d ? c : d : y;  
    

    Init方法

    Init方法应该遵循Apple生成代码模板的命名规则,返回类型应该使用instancetype而不是id。

    - (instancetype)init {  
      self = [super init];  
      if (self) {  
        // ...  
      }  
      return self;  
    }  
    

    类构造方法

    当类构造方法被使用时,它应该返回类型是instancetype而不是id。这样确保编译器正确地推断结果类型。

    @interface Airplane  
    + (instancetype)airplaneWithType:(RWTAirplaneType)type;  
    @end  
    

    关于更多instancetype信息,请查看NSHipster.com。

    CGRect函数

    当访问CGRect里的x, y, width, 或 height时,应该使用CGGeometry函数而不是直接通过结构体来访问。引用Apple的CGGeometry:

    • 在这个参考文档中所有的函数,接受CGRect结构体作为输入,在计算它们结果时隐式地标准化这些rectangles。因此,你的应用程序应该避免直接访问和修改保存在CGRect数据结构中的数据。相反,使用这些函数来操纵rectangles和获取它们的特性。

    应该:

    CGRect frame = self.view.frame;  
    CGFloat x = CGRectGetMinX(frame);  
    CGFloat y = CGRectGetMinY(frame);  
    CGFloat width = CGRectGetWidth(frame);  
    CGFloat height = CGRectGetHeight(frame);  
    CGRect frame = CGRectMake(0.0, 0.0, width, height);  
    

    不应该:

    CGRect frame = self.view.frame;  
    CGFloat x = frame.origin.x;  
    CGFloat y = frame.origin.y;  
    CGFloat width = frame.size.width;  
    CGFloat height = frame.size.height;  
    CGRect frame = (CGRect){ .origin = CGPointZero, .size = frame.size };
    

    黄金路径

    当使用条件语句编码时,左手边的代码应该是”golden” 或 “happy”路径。也就是不要嵌套if语句,多个返回语句也是OK。

    应该:

    - (void)someMethod {  
      if (![someOther boolValue]) {  
        return;  
      }  
      //Do something important  
    }  
    

    不应该:

    - (void)someMethod {  
      if ([someOther boolValue]) {  
        //Do something important  
      }  
    }  
    

    错误处理

    当方法通过引用来返回一个错误参数,判断返回值而不是错误变量。

    应该:

    NSError *error;  
    if (![self trySomethingWithError:&error]) {  
      // Handle Error  
    }  
    

    不应该:

    NSError *error;  
    [self trySomethingWithError:&error];  
    if (error) {  
      // Handle Error  
    }  
    

    在成功的情况下,有些Apple的APIs记录垃圾值(garbage values)到错误参数(如果non-NULL),那么判断错误值会导致false负值和crash。

    单例模式

    单例对象应该使用线程安全模式来创建共享实例。

    + (instancetype)sharedInstance {  
      static id sharedInstance = nil;  
      static dispatch_once_t onceToken;  
      dispatch_once(&onceToken, ^{  
        sharedInstance = [[self alloc] init];  
      });  
      return sharedInstance;  
    }  
    

    这会防止possible and sometimes prolific crashes。

    换行符

    换行符是一个很重要的主题,因为它的风格指南主要为了打印和网上的可读性。

    例如:

    self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];  
    

    一行很长的代码应该分成两行代码,下一行用两个空格隔开。

    self.productsRequest = [[SKProductsRequest alloc]   
      initWithProductIdentifiers:productIdentifiers];  
    

    Xcode工程

    物理文件应该与Xcode工程文件保持同步来避免文件扩张。任何Xcode分组的创建应该在文件系统的文件体现。代码不仅是根据类型来分组,而且还可以根据功能来分组,这样代码更加清晰。

    尽可能在target的Build Settings打开”Treat Warnings as Errors,和启用以下additional warnings。如果你需要忽略特殊的警告,使用Clang’s pragma feature。

    展开全文
  • iOS开发 - 应用国际化开发

    千次阅读 多人点赞 2014-04-25 21:13:39
    而这个时候, 就涉及到了应用的国际化开发。 国际化开发, 通俗来讲, 就是应用能根据用户当前设备使用的语言(本地化)来自动调整应用的语言, 使得每个用户都能正常使用应用。 国际化开发的重要性不言而喻。 总的来说, ...
  • 床头书籍。主要讲了嵌入式软件的大概开发概念,C/C++编程的技巧,实时操作系统和网络的概念。其中C/C++编程的技巧相关内容值得一读;其他内容讲得太抽象化,作为复习用为好。
  • 阿里云服务器开发环境部署 ps:云服务器使用FTP无法连接 如果您使用的是阿里云虚拟主机,并且FTP连接不上,请您通过如下方法进行检查: 您使用什么客户端连接FTP? 使用浏览器或Windows资源管理器很有可能出现...
  • C语言单元测试

    2017-08-25 10:38:00
    对于敏捷开发来说,单元测试必不可少,对于Java开发来说,JUnit非常好,对于C++开发,也有CPPUnit可供使用,而对于传统的c语言开发,就没有很好的工具可供使用,可以找到的有这么几个工具: CuTest -- CuTest...
  • 盘点一些iOS开发技巧:Swift和Objective-C 对苹果开发者来讲,2014年是令人难以置信的一年。在这短短的一年中发生了如此多的变化:在充满吸引力的Swift面前,我们几乎忘了之前是如何痴迷OC;以及充满想象力的iOS8和...
  • CooCox成立于2009年初,致力于为ARM开发者提供免费和开源的嵌入式开发工具。CooCox开发了大量基于网络的组件,让嵌入式开发如搭积木般简单。CooCox希望能和所有ARM爱好者...CooCox工具包括一整套的工具链CoIDE,Colin
  • 嵌入式开发一些衍生知识 一.ubuntu samba服务器搭建 sudo apt-get install samba 配置 vim /etc/samba/smb.conf 在最后添加 #用户名 [colin] comment = server3 zichar browseable = yes #共享目录 ...
  • Colin Laplace 曾经对此作出了解释: " 因忙于现实生活的事务,没有时间继续 Dev-C++ 的开发。 " "不过现在的 Orwell Dev-C++ 已经跟上了: https://sourceforge.net/projects/orwelldevcpp/ 该书介绍的 ...
  • iOS_高效开发之道

    千次阅读 多人点赞 2015-08-12 19:23:55
    iOS_高效开发之道话不多说, 总结一下个人感觉有利于提高iOS开发效率的几个小技巧。本文将从以下几方面介绍: Xcode常用快捷键 Xcode调试技巧 Objc常用代码片段 Xcode插件 Mac工具

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,426
精华内容 570
关键字:

clion开发c