仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1285|回复: 19
打印 上一主题 下一主题

[学习教程] IOS制作之Objective-C 不是你想的那样仓酷云

[复制链接]
再见西城 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
NSStringNSArrayNSDictionary等这些工具在所有的框架里都会出现iOS大部分类都是继承自NSObject(我还没见过不是继承自NSObject的..)Ruby和Objective-C这两种言语看上往仿佛不着边际:一种是静态言语,另外一种则是静态言语;一种是注释型言语,另外一种是编译型言语;一种有简便的语法,另外一种则是有点冗杂的语法。从文雅的角度来看,Ruby仿佛更能给我们一种自在的编程体验,以是良多人都保持了Objective-C。
但这是一个不幸的笑话。Objective-C实在其实不像他人以为的那样是件紧身衣,它和Ruby一样都受Smalltalk影响,它具有良多Ruby开辟者都喜好的言语功效–静态办法查找、鸭子范例、开放的类和一般情形下高度可变的runtime等这些功效在Objective-C中一样存在,即便那些不着名的手艺也是一样。Objective-C的这些功效都要回功于它的IDE和编译器,但也是由于它们才使你不克不及自在地编写代码
可是等一下,怎样能说Objective-C是静态言语呢?岂非它不是创建在C言语的基本上?
你能够在Objective-C代码中包括任何C或C++的代码,但这不料味着Objective-C仅限于C或C++代码。Objective-C中一切成心思的类操纵和对象内省都是来自于一个叫Objective-CRuntime的工具。这个Objective-CRuntime能够和Ruby注释器相媲美。它包括了壮大的元编程里所必要的一切主要特征。
实在C言语和Ruby一样是撑持这些特征的,用property_getAttributes或method_getImplementation办法就可以将selector对应到详细完成(一个selector处置一个办法),并判别这个对象可否对这个selector做出反响,再遍历子类树。在Objective-C的浩瀚办法中,最主要的就是objc_msgSend办法,是它推进了使用中的每次动静发送。

动静的传送

Smalltalk才是实至名回的第一种面向对象言语,它用“从一个对象发送信息给另外一个对象”的新观点代替了“挪用函数”的旧观点,对前面的言语开展发生了深远的影响。
你能够在Ruby中经由过程如许写来完成动静的发送:
1
receiver.the_messageargument

Objective-C的完成体例和Ruby的差未几:
1
[receivertheMessage:argument];

这些动静完成了鸭子范例的体例,也就是说存眷的不是这个对象的范例或类自己,而是这个对象可否对一个动静做出反响。
发送动静真的长短常棒的事,可是只要当动静在传送数据时,它的代价才会被发扬地更年夜:
1
receiver.send(:the_message,argument)


1
2
[receiverperformSelector:@selector(theMessage:)
withObject:argument];

正如Ruby中办法必要symbol撑持一样,Objective-C中selector也必要string来撑持。(在Objective-C中没有symbol。)如许就能够让你经由过程静态的体例利用一个办法。你乃至能够经由过程NSSelectorFromString办法来利用string创立一个selector,并在一个对象里实行它。一样的,我们能够在Ruby中也能够创立一个string或symbol,并把传给Object#send办法。
固然,不管是哪一种言语,一旦你将一个动静发送给不克不及处置该动静的对象,那末默许情形下就会抛出一个非常,还会招致使用的溃散。
当你想在挪用一个办法前判别一下这个对象是不是可以实行这个办法,你能够用Ruby中的respond_to?办法来反省:
1
2
3
ifreceiver.respond_to?:the_message
receiver.the_messageargument
end

Objective-C中也有差未几的办法:
1
2
3
if([receiverrespondsToSelector:@selector(theMessage:)]){
[receivertheMessage:someThing];
}


变得愈来愈静态

假如你想在一个不克不及修正的类(像体系类)中增加你想要的办法,那末Objective-C里的category必定不会让你扫兴—很像Ruby中的“开放类”。
举个例子,假如你想将Rails中的to_sentence办法增加到NSArray类中,我们只必要对NSArray这个类举行扩大就行了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@interfaceNSArray(ToSentence)
-(NSString*)toSentence;
@end
@implementationNSArray(ToSentence)
-(NSString*)toSentence{
if(self.count==0)return@"";
if(self.count==1)return[selflastObject];
NSArray*allButLastObject=[selfsubarrayWithRange:NSMakeRange(0,self.count-1)];
NSString*result=[allButLastObjectcomponentsJoinedByString:@","];
BOOLshowComma=self.count>2;
result=[resultstringByAppendingFormat:@"%@and",showComma?@",":@""];
result=[resultstringByAppendingString:[selflastObject]];
returnresult;
}
@end

Category是在编译的时分将办法增加到程序中—让我们在runtime中静态捕获它们怎样?
有些动静能够嵌套数据,就像Rails的dynamicfinders。Ruby经由过程对method_missing和respond_to这两个办法的重写,先婚配形式,再将新办法的界说增加到这个对象中。
Objective-C中的流程是差未几,但我们不是重写doesNotRecognizeSelector:办法(相称于Ruby中的method_missing办法),而是在resolveClassMethod:办法中捕获Category增加的办法。假定我们有一个叫+findWhere:equals:的类办法,它能够失掉property的称号和值,那末经由过程正则表达式就能够很简单完成找到property的名字,并经由过程block来注册这个selector。
<p>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
+(BOOL)resolveClassMethod:(SEL)sel{
NSString*selectorName=NSStringFromSelector(sel);
NSRegularExpression*regex=[NSRegularExpressionregularExpressionWithPattern:@"^findWhere(w+)Equals:$"options:0error:nil];
NSTextCheckingResult*result=[regexfirstMatchInString:selectorNameoptions:0range:NSMakeRange(0,selectorName.length)];
if(result){
NSRangepropertyNameRange=[resultrangeAtIndex:1];
NSString*propertyName=[selectorNamesubstringWithRange:propertyNameRange];
IMPimplementation=imp_implementationWithBlock((id)^(idself,idarg1){
return[selffindWhere:propertyNameequals:arg1];
});
ClassmetaClass=object_getClass(self);
<p>class_addMethod(metaClass,sel,implementation,
乐观 该用户已被删除
沙发
发表于 2015-1-21 09:49:14 | 只看该作者
iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
第二个灵魂 该用户已被删除
板凳
发表于 2015-2-1 17:02:40 来自手机 | 只看该作者
因为我们老师也是自学的,给我们讲课说的最多的就是百度,谷歌,查文档。
爱飞 该用户已被删除
地板
发表于 2015-2-7 10:14:24 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
活着的死人 该用户已被删除
5#
发表于 2015-2-10 04:27:26 | 只看该作者
学习ios没什么捷径,关键在于多动手敲,曾看到前辈开玩笑说怎么快速学会某技术,答案是:“提高打字速度,快点写代码就能快点学会了”。
只想知道 该用户已被删除
6#
发表于 2015-2-28 19:43:47 | 只看该作者
AD: iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
精灵巫婆 该用户已被删除
7#
发表于 2015-3-2 20:24:07 | 只看该作者
有办法利用自己手头的电脑立刻开始这个美妙旅程的。
变相怪杰 该用户已被删除
8#
发表于 2015-3-6 20:20:39 | 只看该作者
然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,
柔情似水 该用户已被删除
9#
发表于 2015-3-11 14:44:19 | 只看该作者
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
若相依 该用户已被删除
10#
发表于 2015-3-13 22:07:24 | 只看该作者
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
再现理想 该用户已被删除
11#
发表于 2015-3-18 14:52:10 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
小妖女 该用户已被删除
12#
发表于 2015-3-19 22:51:23 | 只看该作者
其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。
小女巫 该用户已被删除
13#
发表于 2015-3-21 15:53:18 | 只看该作者
其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。
不帅 该用户已被删除
14#
发表于 2015-3-24 07:41:13 | 只看该作者
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
再见西城 该用户已被删除
15#
 楼主| 发表于 2015-4-8 09:14:38 | 只看该作者
每个行业都一样,想要一天学有所成是不可能的,一定要做好努力的准备,做ios不是简单的学会oc语言。不怕多走弯路,就怕不肯动手。
透明 该用户已被删除
16#
发表于 2015-4-16 15:09:17 | 只看该作者
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
简单生活 该用户已被删除
17#
发表于 2015-4-21 18:54:40 | 只看该作者
还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。
谁可相欹 该用户已被删除
18#
发表于 2015-4-21 19:52:08 | 只看该作者
这个办法就是在WindowsXP或Win7的电脑上,使用vmware虚拟机来搭建一个真实的Mac OS X环境。
若天明 该用户已被删除
19#
发表于 2015-4-22 05:49:47 | 只看该作者
因为我们老师也是自学的,给我们讲课说的最多的就是百度,谷歌,查文档。
海妖 该用户已被删除
20#
发表于 2015-4-23 02:10:57 | 只看该作者
同很多iOS开发者一样,我也是通过培训进入到iOS开发这个行业,开始没有打算培训,只准备自己学习一些计算机编程相关的知识,毕业时找一份编程相关工作(本人是信息与计算科学这个专业,是数学系)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 19:54

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表