当前位置:首页 » 编程软件 » objectivec编程

objectivec编程

发布时间: 2022-12-26 00:17:53

1. Objective-C的介绍

Objective-C,通常写作ObjC或OC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。GCC与Clang含Objective-C的编译器,Objective-C可以在GCC以及Clang运作的系统上编译。1980年代初布莱德·考克斯(Brad Cox)在其公司Stepstone发明Objective-C。他对软件设计和编程里的真实可用度问题十分关心。Objective-C最主要的描述是他1986年出版的书 Object Oriented Programming: An Evolutionary Approach. Addison Wesley. ISBN 0-201-54834-8.

2. 如何理解 Objective-C编程的KVO 原理

本文来源于:cocoachina
KVO(Key Value Observing),是观察者模式在Foundation中的实现。

KVO的原理

简而言之就是:

1、当一个object有观察者时,动态创建这个object的类的子类

2、对于每个被观察的property,重写其set方法

3、在重写的set方法中调用- willChangeValueForKey:和- didChangeValueForKey:通知观察者

4、当一个property没有观察者时,删除重写的方法

5、当没有observer观察任何一个property时,删除动态创建的子类

空说无凭,简单验证下。

@interface Sark : NSObject @property (nonatomic, ) NSString *name; @end @implementation Sark @end

Sark *sark = [Sark new]; // breakpoint 1 [sark addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]; // breakpoint 2 sark.name = @"萨萨萨"; [sark removeObserver:self forKeyPath:@"name"]; // breakpoint 3 断住后分别使用- class和object_getClass()打出sark对象的Class和真实的Class

// breakpoint 1 (lldb) po sark.class Sark (lldb) po object_getClass(sark) Sark // breakpoint 2 (lldb) po sark.class Sark (lldb) po object_getClass(sark) NSKVONotifying_Sark // breakpoint 3 (lldb) po sark.class Sark (lldb) po object_getClass(sark) Sark 上面的结果说明,在sark对象被观察时,framework使用runtime动态创建了一个Sark类的子类NSKVONotifying_Sark,而且为了隐藏这个行为,NSKVONotifying_Sark重写了- class方法返回之前的类,就好像什么也没发生过一样。但是使用object_getClass()时就暴露了,因为这个方法返回的是这个对象的isa指针,这个指针指向的一定是个这个对象的类对象

然后来偷窥一下这个动态类实现的方法,这里请出一个NSObject的扩展NSObject+DLIntrospection,它封装了打印一个类的方法、属性、协议等常用调试方法,一目了然。

@interface NSObject (DLIntrospection) + (NSArray *)classes; + (NSArray *)properties; + (NSArray *)instanceVariables; + (NSArray *)classMethods; + (NSArray *)instanceMethods; + (NSArray *)protocols; + (NSDictionary *)descriptionForProtocol:(Protocol *)proto; + (NSString *)parentClassHierarchy; @end

然后继续在刚才的断点处调试:

// breakpoint 1 (lldb) po [object_getClass(sark) instanceMethods] <__NSArrayI 0x8e9aa00>( - (void)setName:(id)arg0 , - (void).cxx_destruct, - (id)name ) // breakpoint 2 (lldb) po [object_getClass(sark) instanceMethods] <__NSArrayI 0x8d55870>( - (void)setName:(id)arg0 , - (class)class, - (void)dealloc, - (BOOL)_isKVOA ) // breakpoint 3 (lldb) po [object_getClass(sark) instanceMethods] <__NSArrayI 0x8e9cff0>( - (void)setName:(id)arg0 , - (void).cxx_destruct, - (id)name )

大概就是说arc下这个方法在所有dealloc调用完成后负责释放所有的变量,当然这个和KVO没啥关系了,回到正题。

从上面breakpoint2的打印可以看出,动态类重写了4个方法:

1、- setName:最主要的重写方法,set值时调用通知函数

2、- class隐藏自己必备啊,返回原来类的class

3、- dealloc做清理犯罪现场工作

4、- _isKVOA这就是内部使用的标示了,判断这个类有没被KVO动态生成子类

接下来验证一下KVO重写set方法后是否调用了- willChangeValueForKey:和- didChangeValueForKey:

最直接的验证方法就是在Sark类中重写这两个方法:

@implementation Sark - (void)willChangeValueForKey:(NSString *)key { NSLog(@"%@", NSStringFromSelector(_cmd)); [super willChangeValueForKey:key]; } - (void)didChangeValueForKey:(NSString *)key { NSLog(@"%@", NSStringFromSelector(_cmd)); [super didChangeValueForKey:key]; } @end

3. 如何学好OBJECTIVEC

1.请先把c语言基础学好;
2.看《Programming in Objective-C 2.0》,不要看《Objective-C 2.0程序设计》;
3.看《Cocoa Design Patterns》和《Cocoa Programming Developer's Handbook》,不要因为他们很难而我们自己是初学者所以就不看;
4.是的,你需要一台Mac,如果你真的打算好好学Objective-C和Cocoa的话;
5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;
6.会用Objective-C,并不说明你会Cocoa编程;
7.学语法并不难,Foundation,Appkit,UIKit,Core Data,Core Animation也不过如此——难的是长期坚持实践和不遗余力的查阅文档;
8.请时刻记住,要写出好的App,界面设计和程序功能同等重要——其实可以时刻记住:Mac/iOS用户界面规约也是必读的文档;
9.不看C语言的书,是学不好Objective-C语言的;
10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?
11.浮躁的人容易问:我到底该学什么;——别问,学就对了;
12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;
13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀!
14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;
15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;
16.Cocoa是Objective-C的框架,主要包括Foundation,Appkit和Core Data。Cocoa Touch是Cocoa的iOS版本,主要包括Foundation,UIKit和Core Data;
17.Objective-C不仅仅是为C加了个类——运行时环境同样至关重要;
18.学习编程最好的方法之一就是阅读文档和源代码,请善用Xcode文档里的程序实例源代码;
19.请记住,Objective-C是“动态”的语言;
20.请阅读《Objective-C 2.0 Programming Language》等文档——官方的文档总是最权威,最完整的参考书;
21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
23.请记住,iOS和Mac开发本质上是相同的,不过区别也同样要被重视;
24.不要停留在Xcode的层面上。掌握通过命令行使用gcc和gdb,以及git等工具,将使你效率倍增;
25.和别人一起讨论有意义的Objective-C和Cocoa知识点,而不是争吵Cocoa行不行或者Objective-C与C++哪个好;
26.不要被各种Core XXX等“技术”名词所迷惑,它们只不过是C和Objective-C的框架(库)而已;
27.如果你学过C++,请暂时忘记使用.(点)调用方法,Objective-C是用方括号的,并且更准确的名字叫做“消息传递”;
28.Objective-C是C语言的严格超集,和C语言联系紧密,C语言是Objective-C的一部分;
29.请不要认为学过C++语言再改学Objective-C就没有什么问题——你只不过又在学一门全新的语言而已;
30.读完了《Cocoa Programming Developer's Handbook》以后再来认定自己是不是已经学会了Objective-C;
31.学习编程的秘诀是:编程,编程,再编程;
32.请留意下列书籍:《Cocoa Programming Developer's Handbook》《Cocoa Design Pattern》《iOS 4 Advaced Programming》《Cocoa Programming A Quick-Start Guide for Developers》;
33.不要因为苹果是个商业公司,你就可以忘记开源。于个人来说,开源是给予,但你却获得了更多。别忘了,苹果自己也使用了大量开源技术;
34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;
35.空闲的时候可以把自己的想法变成代码,并放到github上去,或把它变成App Store里的一个软件;
36.请重视Objective-C的运行时环境编程,并将其切实的运用到自己的程序中;
37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;
38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;
39.Objective-C,Cocoa和Xcode集成开发环境要同时学习和掌握;
40.既然决定了学Objective-C,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;
41.工欲善其事,必先利其器,要做好Objective-C和Cocoa开发,请用好Xcode;
42.当你写Cocoa程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);
43.别心急,设计Objective-C的类确实不容易;自己程序中的类和自己的类设计水平是在不断的编程实践中完善和发展的;
44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;
45.每学到一个Objective-C的难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;
46.记录下在和别人交流时发现的自己忽视或不理解的知识点;
47.请不断地对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;
48.保存好你写过的所有的程序——github是你最佳的代码托管工具;
49.请不要做浮躁的人;
50.请热爱Objective-C!

4. Objective-C和C的区别

区别如下:

1.性质不同

Objective-C,通常写作ObjC或OC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。

2.特点不同

Objective-C是非常实用的语言。它是一个用C写成很小的运行库,令应用程序的尺寸增加很小,和大部分OO系统使用极大的VM执行时间会取代了整个系统的运作相反。C语言是一种结构化语言,它有着清晰的层次,可按照模块的方式对程序进行编写,十分有利于程序的调试,且c语言的处理和表现能力都非常的强大。

3.创始时间不同

Objective-C创始时间是1980年代,C语言创始时间是1972年。

5. 如何自学objective c语言

ObjC是进行iOS开发的一门编程语言,也是官方推荐的iOS开发语言。对于没有相应开发经验的人来说,学习ObjC入门会慢一些。一般我把这个学习过程分为三步。

第一步,学习开发语言Objective-C。参考书看《Objective-C基础教程》这本书就行了。书看到后来还需要补充一些关于面向对象的知识,一般计算机专业的学生都是在学C++的时候接触这类思想的。我推荐的那本参考书里也会有一些讲解,进阶的学习需要以后再去看资料,没有特定教材,因为面向对象是一种编程思想,好在Objective-C本身就是这种思想的体现,以后写代码的时候可以慢慢体会。学完《Objective-C基础教程》,就会对iOS开发中所用到的基础数据类有一个了解了,这时候应该就可以写简单的无界面程序了。

第二步,学习iOS开发的软件运行原理,软件开发思想、规范以及一些苹果公司提供的常用标准UI(User Interface,用户界面)控件的使用方法。这个阶段推荐的参考书是《iPhone 4与iPad开发基础教程》,该书有中文译本,虽然不是最新的iOS教程(最新的教程应该是iOS7开发基础教程,但是该书没有中文译本,如果英文过硬,看这本书当然最好)。

第三步,熟悉常用第三方控件。因为苹果本身开放性的局限,其提供的标准开发库会有一些功能局限,智慧无线的网友们开发了各种各样的第三方控件来实现他们想要的功能,可以使开发过程事半功倍。此部分为进阶学习内容,需要在掌握前两步内容的基础上展开。这一步主要是试用,学习第三方代码,要求阅读第三方开发文档以及代码多一些。可以与开发同时进行,边学变进行软件开发。

除了参考书,这里推荐一个网站“Cocoachina苹果开发中文站”里面分享了很多网友的代码,并且可以对自己学习过程中遇到的问题进行讨论。学习初期,中期以及后期进阶都可以在这个论坛找到相应的学习资料与代码,并且可以通过发帖得到大神的技术指点。对应的英文网站是Stackflow,此网站偏重实际开发问题的解决,交流语言为英文。

另外,斯坦福大学每年都开设iOS开发的公开课,从Objective-C的学习到最后的控件使用以及开发思想,架构的学习,都有涉猎,是很好的视频教程。网易公开课中有以往课程配中文字幕的视频,而最新的课程一般没有中文字幕,并且,该课程选择默认学生已经有C++编程基础,可能对于初学者会困难一些。视频属于公开资源,在搜索引擎上搜索斯坦福、iOS等关键字,即可找到相应资源。刚刚简单搜索了一下,优酷已经提供iOS7开发的高清视频专辑。

最后,无论学习哪个操作系统的软件开发,最关键还是要多多练习,因此大量的写练习代码,看别人的优秀代码很重要。

6. Objective-C 程序设计的介绍

《Objective-C程序设计(第4版)》是一本Objective—C编程领域最畅销的书籍,内容涵盖Xcode 4.2和自动引用计数(ARC)。《Objective-C程序设计(第4版)》详细介绍了Objective—C和苹果iOS、Mac平台面向对象程序编程的知识。《Objective-C程序设计(第4版)》结合独特的学习方法,在每章都编写有大量的小程序例子和练习,使Objective—C程序设计适合于课堂教学和自学。

7. Objective-C是一种什么样的语言

Objective-C是一种通用、高级、面向对象的编程语言。它扩展了标准的ANSI C编程语言,将Smalltalk式的消息传递机制加入到ANSI C中。当前主要支持的编译器有GCC和Clang。
Objective-C的商标权属于苹果公司,苹果公司也是这个编程语言的主要开发者。苹果在开发NeXTSTEP操作系统时使用了Objective-C,之后被OS X和iOS继承下来。现在Objective-C与Swift是OS X和iOS操作系统、及与其相关的API、Cocoa和Cocoa Touch的主要编程语言。

8. objective-c与c和c++有什么区别,也是一种编程语言吗

objective-c是一种编程语言,是apple官方的应用开发语言(如iOS、MacOS上的应用)
C和C++的区别在于C++支持面向对象编程
objective-c与二者的区别其实还是有些的,OC也是面向对象编程。但是在OC中它的类也是一个对象,所有OC中的运行时可以做很多事情。
然后就是语法了,OC中类似C\C++的函数调用,成为消息,如我们调用对象A中的sayHello方法,就是给对象A发送一个sayHello的消息
[A sayHello]
其实最终还是转换成了C函数msg_send()
另外OC的运行时代码大部分都是用C实现的
不太清楚你要的区别指什么,大概描述了下

热点内容
安卓泰拉瑞亚去哪里买 发布:2025-07-18 20:01:05 浏览:694
flash编译器 发布:2025-07-18 19:49:38 浏览:487
memcached源码分析 发布:2025-07-18 19:22:42 浏览:866
android展示图片 发布:2025-07-18 19:21:24 浏览:594
一台服务器5个IP怎么分配 发布:2025-07-18 19:12:34 浏览:862
贵阳分布式存储行情 发布:2025-07-18 19:12:31 浏览:361
车场服务器和工控机是如何连接的 发布:2025-07-18 19:10:19 浏览:938
计算机编程学什么好 发布:2025-07-18 19:06:49 浏览:410
网吧用的服务器是什么服务器 发布:2025-07-18 18:40:15 浏览:938
ftp命令使用 发布:2025-07-18 18:13:05 浏览:47