首页 > 其他 > 详细

容易被忽略的Objective-C基础知识点(上)

时间:2016-02-02 23:15:51      阅读:245      评论:0      收藏:0      [点我收藏+]
 
//框架是一种把头文件、库、图片、声音等内容聚集在一个独立的单元中的集合体;每个框架通常包含数十个甚至上百个头文件,每个框架都有一个主头文件,它包含了框架内所有的头文件;通过在头文件中使用#import能访问框架内的所有功能;
//Xcode使用预编译头文件(一种经过压缩的、摘要形式的头文件)来加快读取速度,通过#import导入这种头文件时,加载速度会非常快;
//Objective-C中的BOOL实际上是一种对带符号的字符类型的类型定义,它使用8位的存储空间;编译器仍将BOOL认作8位二进制数(0x2300会被认作是0,即NO值);非零值并不等同于真值YES;
//过程式编程要花时间连接数据和用来处理该数据的函数,且程序的扩展和维护困难;过程式编程是"函数第一,数据第二";
//面向对象编程是"数据第一,函数第二";软件实体应该对扩展开放,而对修改关闭,这样才能更加坚实耐用;
//Objective-C不支持多继承,但可以通过类别(category)和协议(protocol)达到多继承的效果;
//当代码发送消息时,Objective-C的方法调度机制将在当前类中搜索相应的方法。如果没有找到,就会在该对象的超类中进行查找;
//每个方法调用都获得了一个名为self的隐藏参数,它是一个指向接受消息的对象的指针。这些方法通过self参数(基地址偏移原理)来寻找它们需要用到的实例变量;
//继承的类之间建立的关系为"is a(是一个什么)";复合的类之间建立的关系为"has a(有一个什么)",复合通过指针指向对象;存取方法复合是密不可分的,因为通常会为复合的对象编写存取方法;
//@class 指令告诉编译器:"这个一个类,所以我只会通过指针引用它,你不必知道更多信息";
//所有Objective-C对象都使用动态分配的内存,编译器只需要知道这是一个类就可以了,然后就会知道实例变量就是指针的大小;
//视图自身没有逻辑,需要把执行动作(should,did,will method in delegate)的权力委托给别人,如视图控制器;
//协议是一种同另一对象通信的盲方式
//视图不应该拥有它们所显示的数据,数据不应该是它们内部的属性;
//视图的数据源(Data Source)是一种特殊的委托;
//一个MVC可以作为另一个较大的MVC的仆从,这样可以一直往下串联;
//nonatomic方便实现自己的setter和getter方法(不需要锁定);
//@property (nonatomic,getter=isChosen) BOOL chosen  重命名了getter方法名;
//-(void)addCard :(Card*)card   atTop: (BOOL)atTop; & -(void)addCard :(Card*)card   atTop: (BOOL)atTop; Make atTop: (BOOL)atTop  Optional !
//Objective-C中的所有实例变量都是从0/nil开始的;
//[[myObject alloc]init] 分配对象在堆中并初始化;不初始化就分配对象在堆中毫无意义;
//模型类对象 最好 分在另外新的一个文件夹Model;
//[NSArray  mutableCopy]返回NSMutableArray;  [NSString mutableCopy]返回NSMutableString;  而copy方法意味着返回不可变副本;
//动态绑定:实际上OC中的所有指针都是id, 当你将消息发给一个对象时, 具体执行什么代码直到运行时才会决定。(编译器使用静态类型化:NSString* 只是编译器的语法);
//保护id类型 (盲通信,firstObject) : ① 内省(isKindOfClass/isMemberOfClass/respondsToSelector)  ② 协议(是否遵守);
//NSSet查找对象通过hash,NSArray使用二分法查找;因此NSSet对象更有效率;
//不要把创建的子类作为键,只有在对象确保是唯一的时候才能将其作为键;
//ViewDidLoad时,视图还在storyboard中;
//NSNotification有三个属性:①name(通知的名字) ②object(谁发送的这个通知;来自系统或者应用内) ③ userInfo(广播站的信息);
//每次向block中的对象发送消息时,系统就会创建一个指向该对象的强指针(捕获对象);block相当于锦囊;
//请不要创建NSString、NSArray、NSDictionary的子类,因为在Cocoa中许多类实际上是以类簇的方式实现的;但通常可以将NSString、或NSArray复合到你的某个类中或使用类别来解决这种编程中的问题,而不是特意去创建子类;
//不能在集合中放入nil值,因为在NSArray和NSDictionary中nil有特殊的含义;当确实需要存储一个表示"这里什么都没有"的值,就用[NSNull null];
//ARC不是垃圾回收器,垃圾回收器在运行时工作,通过返回的代码来定期检查对象。ARC则是在编译时进行工作的,它在代码中插入合适的retain和release语句;
//在Cocoa中,分配和初始化是两个分离的操作:来自NSObject的类方法alloc为对象分配一块内存区域并将其清零,实例方法init用于获得一个对象并使其运行;
//某个实体"拥有一个对象"时,意味着该实体要负责确保对其拥有的对象进行清理;
//想要在代码中使用ARC,必须满足:①能够确定哪些对象需要进行内存管理; ②能够表明如何去管理对象; ③有可行的办法传递对象的所有权;
//你不能简单地将一个可保留对象指针(ROP)表示成不可保留对象指针(non-ROP),因为指针的所有权会移交;为了让ARC便于工作,需要告诉编译器哪个对象是指针的拥有者;为此可以使用一种称为"桥接转换"的C语言技术;
//eg:NSString*theString=@"Learn Objective-C";  CFStringRef cfString=(CFStringRef)theString; 
//有些属性是基于变量的,使用关键字@dynamic来告诉编译器不要生成任何代码或者创建相应的实例变量——我们自己来;
//属性只支持替代setMyObject和myObject的方法,但是不支持那些需要接受额外参数的存取方法
//类别是一种为现有的类添加新方法的方式,通常把类别代码在独立的文件中,会以"类名称+类别名称"的风格命名;一个类可以添加任意数量的类别;类声明和类别声明可以在同一个.h文件里,然后将这些类别的实现代码放在不同的.m文件中;
//类别的缺陷:①可以在类别中添加属性,但是不能在类别里添加实例变量,而且属性必须是@dynamic类型的; ②类别中的方法比源代码中的初始方法有更高的优先级;
//类别的用途:①将类的实现代码分散到多个不同文件或框架中; ②创建对私有方法的前向引用; ③向对象添加非正式协议;
//类扩展:①不需要名字; ②可以包含在你源代码的类中使用它; ③可以添加实例变量; ④可以更改只读权限; ⑤创建数量不限;

容易被忽略的Objective-C基础知识点(上)

原文:http://www.cnblogs.com/caomeinatie/p/5178595.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!