1.头文件
头文件中包含结构体,符号常量,宏,函数原型等信息。
#import在 objective c 中可以对重复的头文件只加载一次。
#import <Foundation/Foundation.h> --> <>括号中的内容, 前面是框架名称,后面是头文件名称
#import "myhead.h" --> 自己的头文件要使用 " " 这个符号
BOOL 类型, 是用8位存储空间存储的内容, 所以不能使用超过这个大小的整数当做"真" , 所以BOOL类型的最好使用 NO, YES 作为值, 比较时, 最好将BOOL类型和NO比较
在c中非0 即为yes, 但是在 objective-c 中 非0 并非一定是yes, 所以最好不要使用yes进行判断。
id 是一种泛型, 用于表示任何种类的对象, id实际上是一个指针, 指向其中的某个结构 .
2.在编辑objective c程序时如果想把警告也当作错误对待,进而进行必要处理,设置方法如下
可以让xcode总是将警告作为错误来处理。方法是,选择Xcode Groups & Files 列表顶端的项目,选择 file->Get Info 命令,选择 Build 选项卡,
在搜索区输入“error”,然后勾选 Treat Warnings as Errors 复选框,如下图
3.基础注意 语法
objevtive-c 的函数声明中 函数的返回类型和参数类型要加括号,例如 : -(void) draw :(ShapeColor) fillColor
qty : ( int ) count ; --> 参数没括号
例如:-(void) draw ; -->没有参数连参数的括号都没由了
+(void)drar ; -->表示类方法
在 implementation 中,如果不是 interface 声明的方法,则为私有方法( 貌似好像也有办法调用 ) , 也可以声明变量 ( 私有变量 )
在 .m文件中
@interface abc() --> 注意这个()
{
声明私有变量
@property double abc;
}
@end@implementation
@synthesize abc = _abc;
@end
注意:成员函数写法与main函数等普通函数写法不同,普通函数还是按照c中的写法进行。
实例变量在 implementation 中, 可以直接使用, 不需要 this.实例变量, 所以当命名方法中的变量时,注意查看参数是否与实例变量同名。 --> objective 中使用 self
self->实例变量 ( 也是对的 ) 所以当在 implementation的方法, 参数名称应该避免与 实例变量同名 , 例如 -(void) draw : (ShapeColor) c 此处的 c 就是要区分 .
创建新对象 Circle * c = [ Circle new ]
继承语法 @ interface Circle : NSObject ( objective 只支持单继承 )
不要直接更改由继承得到的实例变量的值,一定要使用方法来更改它们。
objective-c 的方法调度程序将在当前类中搜索相应的方法,如果调度程序无法在接收消息的对象类中找到相应的方法,它就在该对象的超类中进行查找。
头文件 #import "Circle.h" ( 类似 C , <> 表示的是导入系统头文件 , "" 表示导入本地头文件 )
文件依赖 : 导入头文件在头文件和进行导入的源文件之间建立了一种很强的依赖关系 , 如果头文件有任何变化 , 则所有依赖于它的文件都需要被重新编译. ( 很多 , 很慢 )解决文件依赖的办法 : 如果只是需要知道类名 ( 例如复合中的类实例变量 ) , 则不需要将头文件包括进来 #import "Circle.h" , 而只要声明一下, 这是一个类就可以了 , 因为在类实例变量的情况下 , 对象本身也只是保存了一个指向符合类的指针 , 语法为 @class Cicle ; 声明一个类 ( 这个生命要在 @interface 外 ) , 但是在 implemention文件中就需要 #import "Circle.h"这个头文件了 , 因为编译器此时要知道细节( Circle 类的细节 ) , 另外 继承的关系也必须使用 #import , 很显然 , 因为继承时 , 编译器需要知道父类的细节.
OOP 中的重构 : 通过移动某些代码来改进程序的架构 , 通常的开发周期包括向代码中添加某些特性, 然后通过重构删除重复的代码 . ( 改变内部结构 , 不影响外部行为 )
内存布局 --> 新生成实例的实例变量的内存布局
变量 类
isa | NSObject |
fillColor bounds | Shape |
radius | RoundedRectangle |
NSObject 声明了一个名为 isa 的实例变量
Shape 声明了 fillColor , bounds
RoundedRectangle 声明了 radius
创建一个新类时 , 对象首先从自身的超类中继承实例变量 ( isa , fillColor , bounds ) , 然后添加他们自己的实例变量 ( radius ) , 其中 isa 保存一个指针 , 指向对象的类, 所以每个实例对象都可以通过此实例变量找到自己类的模型(struct ),而每个类多直接或者间接继承了NSObject这个类, 所以每个实例对象都有此实例变量,也就都能找到自己的模型(struct), 所以 NSObject 的实例变量称为 isa . 使用更具体种类的对象代替一般类型 , 这个情况叫多态 ( Java 中的"上行")
self 与 super 都是指针 , self 指向本对象的首地址 , super 指向父类(注意不是对象)的首地址, 并且是逐层向上 .
每个方法调用都获得了一个名为self的隐藏参数,它是一个指向接收消息的对象指针,方法使用self参数查找它们要使用的实例变量
[ super setFillColor : c ] 调用父类中的方法 ( 即便在子类中包含 setFillColor方法 )
调用方法时,沿着继承关系,一直向上,直到找到为止。
Objective c 中 定义实例变量是要用指针 Circle *pc ; 这个指针就指向实例的启始地址 .
复合中的实例变量( 类实例子) 只保存对象的指针 , 而不是对象本身 )
NSLog输出函数 , 如果输出的是 %@ 类信息 , 实际上就是调用类本身的 description函数 , 可以重写这个函数 . ( 只的是输出对象的时候 , 输出 @"abc" 则是输出常量 )
基础类的介绍
NSString 不可以改变, 一旦给值就不能再改变。
NSRang , NSSize, NSPoint, NSRect
NSArray 存储集合类型,就是数组 ( 限制1,只能存储对象,不能存储c中的基本类型,限制2,不能储存NULL,nil 等空值)
NSEnumerator 枚举王国
NSDictionary 字典 也叫散列表火哈希表
@property 成员变量 ;( 自动生成 getter和setter方法) 在 interface 文件中
@synthesize 成员变量 ; 在 implementation 文件中
类别 category :是以种为现有类添加鑫方法的方式,
@interface NSString (NumberConvenience)
-(NSNumber *) lengthAsNumber;
@end
此处就是在NSString这个类中添加了一个类别, 可以添加无数个类别,类别名称为 NumberConvenience , ( 注意括号后边的类别名称等等 )
实现类别
@implementation NSString ( NumberConvenience )
-(NSNumber *) lengthAsNumber{
}
@end
类别的局限性 ,1不能增加成员变量,2当方法名冲突时(之前存在此方法明), 则覆盖
委托:是一种对象,另一个类的对象会要求委托对象执行它的某些操作。
协议:( java中的接口) , 一旦使用协议,就必须实现协议的所有方法。一个没有实现的方法列表。
@protocol NSCopying
-(id) copyWithZone:(NSZone *)zone
@end
@interace Car : NSObject <NSCopying,NSCoding> --> 注意此处尖括号为协议, 可以实现多个协议
@end
Apple
4. Apple编辑常用操作
shift + command + 左右 = 编辑整个行
shift + 左右 = 编辑单个字符
command + 左右 = 光标到这行的最前和最后
command + 上下 = 光标到最上和最下
command + [ ] 可以是代码向左 / 向右移动
选中 ,左键 单击 , 选择 Re-indent selection 可以重新缩进
按 tab 键盘可以自动提示,也可以使用Esc 键 来查看完整的名称。
control + / 移动到下一个参数占位符
创建快照 file->make snapshot ( 快捷键 command-control-S),在要“破坏”程序之前,可以先使用快照进行保存,如果出现问题,可以使用file->snapshots恢复之前的内容。
control + L 将光标置于窗口正中
file->open quickly 可以打开想看的文件
添加书签, 在Group & Files 的 Bookmarks 中可以看到
集中注意力,将鼠标放到代码前面区域。
按照option 双击类名,可以查看类内容。
断点可以通过脱出边列来删除它。也可以通过单击来禁用它。
5. Xcode中的结构
Groups & Files 下的首项项目:
classes : 最常用的一个文件夹,你编写的大多数代码都保存在这里,包括objective-c 类。
Other sources : 包括除objective-c类之外的源代码文件。通常,other sources文件夹不会占用你太多时间。创建新iphone程序之后,此文件夹包含两个文件。
.pch 文件 ( precompiled header , 预编译的头文件 ) 这是项目所使用的来自外部框架的一组头文件。
main.m 主文件
Resources 包含应用程序中的非代码文件(包括 图标图像 其他图像 声音文件 影片文件 文本文件 程序运行属性列表 (.nib .xib Interface Builder文件.plist 属性列表文件))
Framworks 是一种特殊的库,其中可以包含代码,图像和声音文件等资源。( 框架 , 包括 CoreGraphics.framwork, Foundation.framwork, UIKit.framwork)
Products 包含此项目在编译时生成的应用程序
Interface Builder
File's Owner 拥有此nib文件副本的对象。
First Responder 当前正在与之交互的对象。
View UIView类的一个实例。用户可以看到并能与之交互的区域。
6. MVC 模型
模型( model ) : 保存应用程序数据的类
what your application is ( but not how it is displayed ) 例如 飞机游戏,那么飞机的血量,护甲等等都是在说明这个application是什么。
视图( view ) : 窗口,控件
Your controller's minions,具有通用性,ipad, itouch等等全都可以使用。只是用来显示的。
控制器( controler ) : 将模型和视图绑定到一起,确定如何处理用户输入的应用程序的逻辑。 管理与通信
How your Model is presented to the user ( UI logic )
MVC的目标是实现3类尽可能截然不同的代码。编写的任何对象都应该能很明显地归为其中一类。
创建模型的方法是涉及一些objective-c类来保存应用程序数据。
controler于view交互 : 控制器类可以使用一种特殊的实例变量来引用nib( who owns view )中的对象,这个变量就是输出口( outlet ), 可以把输出口堪称是指向nib中
的对象的指针。另一方面,也可以设置nib文件中的界面对象触发控制器类中的特殊方法。( 操作方法 ).
控件的状态( view 中 ) : 1 正常( normal ) 表示控件处于活动状态,但是当前并未使用
2 突出显示 ( highlighted ) 表示控件正被按住或正被使用
3 禁用 ( disabled ) 表示控件未启用且无法使用
4 已选中 ( selected ) 仅特定控件具有该状态,表示控件已被选中。
快速查找文件方法 : 将光标移动要查看处,光标应转变未十字线,然后,双击鼠标按钮。