Objective-C学习笔记

objective-c学习笔记

  • 使用import <xxx/xxx.h>的方式来引入头文件,结构体等
  • .m结尾的文件,m代表message,表示其有消息的特性
  • Foundation框架是基础功能框架,提供了类似string,集合等一些基础功能,记得F是大写的
  • NSLog用来输出控制台文本,类似println,同时@”hello world”代表的是NSString,是Objective-c的字符串类
  • NS前缀是为了防止函数名冲突,NS代表NextSTEP
  • BOOL类型的YES和NO,本质是byte,0代表NO
  • BOOL是对象,使用%@输出
  • 每个对象都可以实现一个叫description的方法,类似java的toString,BOOL对象也不例外
  • Objective-C是面向对象的语言,所以你在java学到的面向对象的一些技巧,和设计模式一样适用
  • 第三章的第一节就是c语言的例子,解释拙劣的间接概念,食之无味
  • 第三章的第二节例子还不错,讲的是面向过程和面向对象的区别,以及维护程序的开闭原则,对修改需要封闭,对添加需要是开放的
  • id 类似java的Object对象,可以指向任何对象
  • 调用方法,使用发送消息机制,[obj method]
  • @interface 类名 : NSObject和java的interface不同,类似java的class,@interface可以有成员变量,类似java的抽象类
  • 记得任何类定义后面以@end结尾
  • 使用{}声明属性,- (返回参数类型) 方法名:(参数类型) 参数名称
  • @implementation 实现类,不需要有实现类类名
  • self类似java的this
  • 可以通过对类发送new消息创建对象,类似这样 [Xxx new]
  • 第四章继承没啥特殊的,调用父类方法一样使用的是super
  • 第五章组合,我喜欢使用组合,而不是复合这个名词
  • 不要将get用作getter方法的前缀,get往往意味着传递的是参数指针,而不是通过返回值获取内容
  • 第四章和第五章无非就说了面向对象的isa和hasa
  • 第六章 源文件组织 群组的概念,虚拟组装文件分类的方式,不一定和物理文件对应
  • import文件<>和””的区别是<>代表的是系统头文件,而后一个是自己的项目文件
  • @class和@import的区别,在于符号链接和预编译的区别,也就是将实际类型推迟到运行时,还是编译级别就需要感知
  • 第七章 深入了解Xcode 无他唯手熟而
  • 第八章 Foundation Kit介绍
    • 可以使用+来声明类方法,例如NSString的 stringWithFormat
    • NSString的方法isEqualToString和compare以及length方法
    • NSString是不可变的和java的一样,可以使用NSMutableString替代,类似StringBuilder,可以appendString
    • 集合类:NSArray和NSDictionary,NSArray和NSDictionary是不可变的,如果需要动态变化,需要加上Mutable
    • 可以通过arrayWithObjects类方法创建数组,并以nil结尾代表结束,所以数组不能存储nil以及基本类型,如int,enum
    • 也可以以字面量创建数组,类似这样@[@”xxx”,@”sdad”],则不需要使用nil结尾
    • 枚举可以通过NSEnumerator,也可以快速枚举,in的形式
    • NSNumber以及NSValue和NSNull
  • 第九章 内存管理
    • 对象的生命周期,引用计数
    • 每个对象都有一个引用计数器,当通过new,alloc或者copy创建一个对象时,其引用计数器为1,可以通过retain使其+1,release使其-1,每当对象的引用计数器为0,将要被销毁的时候,将会对其发送dealloc消息,你可以重写dealloc方法,以便释放对象申请的资源,可以通过retainCount获取引用计数的值
    • 对象所有权,谁创建谁负责,传递引用需要根据情况判断是否retain
    • 访问方法中的保留和释放,原则是先对传入的retain再对老的对象release,然后新的赋值给老的引用变量
    • 自动释放,@autoreleasepool以及NSAutoReleasePool,其实就是把每次release的消息延迟到最后,统一发送而已
    • 内存管理的三条规则:
      • 当你使用new,alloc或者copy创建一个对象时,该对象的保留计数器值为1,当你不再使用该对象时,需要对其发送一条release或者autorelease消息
      • 当你通过其它方法获得一个对象的时候,如果你打算一段时间内拥有它,你需要retain它,以防别人release掉,然后在你不再使用之后,release它
      • 如果你保留了某个对象,最终你需要释放或者自动释放它,必须确保retain和release的方法次数对等
    • iOS开发不能使用自动垃圾回收,而是使用自动引用计数(ARC),ARC只对可保留的对象指针有效
      • 代码块指针
      • Objective-C对象指针
      • 通过__attribute__((NSObject))类型定义的指针
    • 如果想在代码中使用ARC,必须满足以下三个条件
      • 能够确定哪些对象需要进行内存管理
      • 能够表明如何去管理对象
      • 有可行的办法传递对象的所有权
    • 弱引用,可以避免循环引用而得不到释放的情况,如果软引用的对象被释放了,会导致使用出问题,可以使用归零弱引用,可以使用关键字_weak或者属性@property(weak),只对ios5和10.7以上有效
    • 使用ARC的时候,有2种命名规范:属性名称不能以new开头;属性不能只有一个read-only而没有内存管理特性
    • 异常,NSException,@try @catch @finally @throw
  • 第十章 对象初始化
    • 分配和初始化,使用alloc分配内存而使用init初始化对象
    • 使用一条语句分配和初始化对象:Car *car=[[Car alloc]init]
    • [super dealloc]应该为dealloc方法的最后一条语句,并且不要忘记
  • 第十一章 属性
    • 可以通过@property标示一个类的属性,而不需要写getter和setter了,实现类里可以使用@synthesize标示,但是Xcode4.5之后就可以不使用@synthesize
    • 点表达式的使用,可以类似java一样存取属性,编译器会处理getter和setter调用
    • 属性扩展,@property(copy) @property(retain) @property(assign)
    • 名称的使用,如果实例变量和局部变量名称不一致,则可以这样@synthesize 访问方法名=实例变量名
    • 只读属性,@property默认是readwrite的,也可以单独设置为readonly
    • 可以使用@dynamic标示不需要自动生成getter和setter方法
  • 第十二章 类别
    • 类别是为现有的类添加新方法的方式
    • 把类别代码单独放在一个文件中,以类名称+类别名称命名
    • 添加方法,@interface 类名(类别名称),可以通过@dynamic添加属性
    • #import “类名称+类别名称”.h
    • 类别的缺陷:无法添加实例变量,方法覆盖
    • 类扩展,可以添加实例变量,可以改变只读属性,但是只在类内部有效,作用可以对外隐匿实现
    • 利用类别可以分散实现代码
    • 通过类别创建前向引用,当访问没有在接口声明的实例方法时,编译器会给出警告,消除警告的方法是通过类别声明方法,但是规范要求不能访问私有方法,所以最好不要这么干
    • 非正式协议:创建一个NSObject的类别称为创建一个非正式协议
    • 响应选择器,如何知道一个对象是否可以响应一个消息呢?可以使用@selector(),并且可以使用NSObject的respondsToSelector方法测试
  • 第十三章 协议
    • 协议类似java的接口,通过@protocol声明,协议可以继承协议,通过 @protocol Xxx <Father>
    • 类声明实现某个协议时通过后面跟 <协议名>实现,多个协议之间通过,分割

发表评论

电子邮件地址不会被公开。 必填项已用*标注


5 × = 二十 五

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">