初见Object C
阅前提示
入门级文章,不涉及深入研究,需要一点其他语言基础,此文章主要我个人对学习下来的总结笔记。
基本语法不过多赘述,可直接看代码来了解。
文章主要涉及部分:
OC 面向对象
Foundation库相关 待补充
技巧与关键字 不断更新
Object C
面向对象
一个类可以分为三个部分:interface 、inplementation、program
一般 interface 部分会写在.h文件中 ,inplementation 部分写在.m文件中
方法声明:
- (void) setNum : (int) a; // 方法类型 (返回类型) 方法名 (:有参数的方法) (参数类型) 参数名
例:简单的类
//@interface 声明类的 继承关系、属性和方法 @interface ASimpleClass : NSObject {NSString *name;} -(void) print; //负号开头代表是实例方法 //+(void) print;// 正号代表类本身的方法 -(void)setName :(NSString*) _name; -(void)setNum : (int) n; -(int) getSum : (int) a1 : (int) a2; @end //@implementation 主要是对声明进行具体定义 @implementation ASimpleClass { int num; } -(void) print { NSLog(@"%@", name); } - (void)setName:(NSString*)_name { name = _name; } -(void) setNum:(int)n { num = n; } - (int)getSum:(int)a1 :(int)a2 { return a1 + a2 + num; } @end //program 包含解决特点问题的代码,可以跨越多个文件 int main(int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello, World!"); //注意同文件前后文影响 ASimpleClass *cA;//*号代表指针,即引用 cA = [ASimpleClass new];//创建类实例 等同于 *Class = [[ASimpleClass alloc] init]; ASimpleClass *cB = [[ASimpleClass alloc] init]; [cA setName:@"class A"]; [cB setName:@"class B"]; [cA print]; [cB print]; [cA setNum:0]; NSLog(@"Sum : %i",[cA getSum:2 :3]); } return 0; }
例:一般类
@property + @synthesize 合成存取方法,相当于get set
// NormalClassA.h #import <Foundation/Foundation.h> @interface NormalClassA : NSObject @property NSString* name ; // @property + @synthesize 等同于使其获得了get,set功能 @property int num; -(void) print; -(void)setNum : (int) n; -(int) getSum : (int) a1 : (int) a2; @end
// NormalClassA.m #import <Foundation/Foundation.h> #import "NormalClassA.h" @implementation NormalClassA @synthesize num;// 这里可以省略,但在这里使用时需要以(_)下划线字符开头 - (int)getSum:(int)a1 :(int)a2 { return a1 + a2; } - (void)print { NSLog(@"%@:%i",_name,num); } @end
分类
基本分类
@interface 类名(类别名){属性} @end
// NormalClassA.h #import <Foundation/Foundation.h> @interface NormalClassA : NSObject @property NSString* name ; // @property + @synthesize 等同于使其获得了get,set功能 @property int num; -(void)setNum : (int) n; -(int) getSum : (int) a1 : (int) a2; @end
// Pinter.h #import "NormalClassA.h" @interface NormalClassA(Pinter) -(void)print:(NSString*) msg @end
// Pinter.m #import "Pinter.h" @implementation NormalClassA(Pinter) -(void)print:(NSString*) msg {...} @end
扩展
@interface 已有类(){属性} @end
扩展相当于匿名类别,扩展用于临时的对某个类的接口进行扩展,在类的实现部分同时实现类接口部分声明的函数与扩展部分声明的函数。
在定义类的扩展时,可以添加成员变量与属性,但定义类别时不允许添加成员变量与属性
@interface NormalClassA() -(void)Dispose; @end @implementation NormalClassA ... -(void)Dispose{...} @end
协议
协议的定义
@protocol protocolName <这里可以写继承的协议/或者不写> ...//方法声明 @end @interface NormalClassA : NSObject <protocolName,...> ... @end
约束
@protocol protocolName @required methodName;//必须被实现 不加也是默认为此 @optional methodName;//可选择实现 @end
使用
@portocol IDispose -(void)Dispose; @end @interface NormalClassA : NSObject <IDispose> ... @end @implementation NormalClassA ... -(void)Dispose{...} @end id <IDspose> d; NormalClassA *a = [NormalClassA new]; d = a; a.Dispose; d.Dispose;
Foundation
TODO
技巧
多参数方法定义
-(void) Print : (int) a and : (int) b [c Print:1 and 2] -(void) Pirnt : (int) a : (int)b [c Print:1:2]
关键字
@class
用来告诉编译器这是一个类,编译器只需要通过指针来引用它即可,并不需要知道关于这个类的更多信息,可以用来减少编译。
@selector
每个类的方法列表都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL类型的数据就可以找到方法的地址,进而调用方法。
typedef struct objc_selector *SEL;
SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法,其实发送的消息就是SEL。
对于所有的类,只要方法名是相同的,产生的selector都是一样的。
@selector(meathName)就是取类方法的编号,等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取. 它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)
//对象是否能相应selector指定的方法 YES/NO -(BOOL) respondsToSelector:Selector //应用selector指定的方法 -(id)performSelector :selector withObject:obj1 whitObject : obj2
例:
id value = [ASimpleClass new]; SEL action = @selector(print); if([value respondsToSelector:action] == YES) { [value setName:@"A"]; [value performSelector:action];//A }
super
用于子类调用父类方法,在重载的时候用的比较多
self
指代本身,相当于C# 的 this
id
id 数据类型可以用来保存任何类型的对象。
id value; ClassA *a = [ClassA new]; ClassB *b = [ClassB new]; value = a; [value print];//执行a的print方法 value = b; [value print]; //执行b的print方法
extern
用来声明在其他文件中的全局变量。
// A.h int globalVar = 1; // other.m #import "A.h" extern int globalVar; //这是在告诉编译器,我申明的这个变量在其他文件中,你去帮我到其他文件找,如果找不到当你使用这个变量时会报错,所以确定变量名一致
static
在OC中,在变量声明前加上关键字static,只会初始化一次是它的特性。一般用在方法中,统计方法的执行次数,定义一个static修饰的变量比较好。
typedef
给某种类型顶一个定义比较容易记的名字
简化较为复杂的类型声明
typedef int I; I a,b; typedef enum AEnum { A = 0, B, C, } Answer; Answer a = A;
- C08(初见AWT)
- Groovy 我之初见
- 人生若只如初见
- 人生若只是初见
- [Object C] 字符串和数组NSString NSArray操作
- object c runtime中类类型和消息支持检查
- Object C 获取日期
- object c 操作date类型
- 人生可以只如初见
- AOP之PostSharp初见-OnExceptionAspect
- 人生,又怎会一如初见?
- WCF初见之HelloWorld
- WCF初见之SQL数据库的增删改查
- 初见Three20【为什么Three20的Samples运行后没有反应?】
- 人生若只如初见
- Object C 类的定义和实现
- object C---------数组:NSArray ----NSMutableArray
- Ch1——初见get和set
- object C 简单总结
- object c解析(包含本地和远程)xml文件