0 > OC简介
OC语言在c语言的基础上,增加了一层小小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c++代码。
OC语法非常简洁且高效
可以使用OC开发mac osx平台和ios平台的应用程序。
拓展名:c语言- .c OC语言 .-m 兼容C++ .-mm
历史:
Cocoa和Objcctive-C是苹果公司OSX和iOS操作系统的核心,早在20世纪80年代,Brad Cox为了融合流行的,可移植的C语言和优雅的Smalltalk语言的优势,就设计出了Objective-C语言.
1985年,Steve Jobs 创立了NeXT公司,致力于创建功能强大且经济实惠的工作站,该公司选择用Unix作为操作系统并创建了NextSTEP.
1996年,苹果公司收购了NeXT公司,NextSTEP更名为Cocoa .
注:其实c语言和oc甚至任何一门语言都只是我们为了实现一些功能,达到一些效果而采用的工具,抛开语法的差别外,我想最重要的应该是在解决问题的时候考虑的角度和方法不一样而已,然而这也构成了学习一门语言的重要性。
1 > OC语法概要
(一)关键字
基本上所有的关键字都是以@开头的(为了与c语言的关键字区分开来),如@interface @implementation @public等,少部分没有以@开头,如id,_cmd等
(二)字符串以@开头
C语言字符串:“hello”
OC语言字符串:@“hello”
当然,OC中的字符串不仅是一个变量还是一个对象,
还可以用特殊的操作将非OC对象转换为OC对象, @(非OC对象) ,
当然,如果你不在Xcode平台下编写程序代码是不能确保一定能转换的,
(三)其他语法
基本类型:5种,增加了布尔类型
Nil相当于是null,也就是0。
屏幕输出:NSLog(@“hello”);//自动换行
NSLog(@“age is %d”,2);
2 > OC开发流程
#import预处理指令有两个作用:(1)与#include一样,拷贝文件内容(2)可以自动防止文件的内容被重复拷贝
程序编译连接过程:
源文件(.m)---(编译)---->目标文件(.0)-----(链接)---->可执行文件(.out)
Foundation(基础) 框架 : 如果要使用框架中的所有头文件那么应该怎么办?包含框架的主头文件。主头文件是一个框架中最主要的头文件,每个框架的主头文件名和框架名一致。
如#import<foundation/foundation.h>
注意:
每一个框架都是一个重要的技术集合,通常包含数十个甚至上百个头文件.通常情况下每一个框架都有一个主头文件,它包含了该框架内所有的头文件.
而OC中Foundation框架处理的是用户界面之下的那些 层(Layer)的特性,如数据结构和通讯机制,
运行过程如下:
(1)编写OC源文件 .m .c
(2)编译文件 cc -c xx.m xxx.c
(3)链接 cc xx.o xxx.o -framework Foundation
(4)运行 ./a.out
注意:
C语言中通常用#ifdef命令的方案来避免一个文件包含另一个文件,而后者又包含前者的情况,
在OC中使用@import 可以避免使用这种 复杂而又麻烦的 条件编译指令.
3 > OC类型补充
OC中有BOOL(布尔类型)
BOOL值有YES和NO 两个,
由于OC是基于C语言的,所以OC可以使用C的一切类型,包括Typedef ,,,
typedef signed char BOOL;
宏定义:
#define YES (BOOL)1
#define NO (BOOL)0
当然,这个宏是系统定义过的- -
#if __has_feature(objc_bool)
#define YES __objc_yes
#define NO __objc_no
#else
#define YES ((BOOL)1)
#define NO ((BOOL)0)
#endif
/// Type to represent a boolean value.
#if !defined(OBJC_HIDE_64) && TARGET_OS_IPHONE && __LP64__
typedef bool BOOL;
#else
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
#endif
不要重复定义系统提供的宏,
宏定义往往伴随着复杂的条件编译,所以初学者不要纠结这些细节问题,,
4 > 面向对象开发oop
OC是在C的基础上做了一些面向对象的处理并且OC完美兼容C语言,只不过在类型上有些细微的差别
面向对象关注的是设计能够解决问题所需功能的类,
<1> 类的设置主要关注三个东西: 类名称, 属性, 方法
类的声明:
@interface SAMObjectDemo : NSObject
@end
类的实现:
#import "SAMObjectDemo.h"
@implementation SAMObjectDemo
@end
当然,可以把类的声明和实现写在同一个文件中, 大部分分类是这样写的,
分类:
@interface SAMObjectDemo (SAMCategory)
// 可以在分类中添加属性,但是不能添加实例变量(成员变量),而且属性必须是@dynamic
// 在分类中添加属性的好处就是你可以通过getter或者setter方法的点语法访问属性值,
@end
例如: 我给UIView添加了一个分类用于快速访问控件的frame
1 #import <UIKit/UIKit.h> 2 3 @interface UIView (SAMExtension) 4 5 /** 6 * 一个View的x点的坐标 7 */ 8 @property (nonatomic, assign) CGFloat x; 9 /** 10 * 一个View的y点的坐标 11 */ 12 @property (nonatomic, assign) CGFloat y; 13 14 /** 15 * 一个View的width 16 */ 17 @property (nonatomic, assign) CGFloat width; 18 19 /** 20 * 一个View的height 21 */ 22 @property (nonatomic, assign) CGFloat height; 23 24 25 @end
#import "UIView+SAMExtension.h" @implementation UIView (SAMExtension) - (void)setX:(CGFloat)x{ CGRect frame = self.frame; frame.origin.x = x; self.frame = frame; } - (CGFloat)x{ return self.frame.origin.x; } - (void)setY:(CGFloat)y{ CGRect frame = self.frame; frame.origin.y = y; self.frame = frame; } - (CGFloat)y{ return self.frame.origin.y; } -(void)setWidth:(CGFloat)width{ CGRect frame = self.frame; frame.size.width = width; self.frame = frame; } - (CGFloat)width{ return self.frame.size.width; } - (void)setHeight:(CGFloat)height{ CGRect frame = self.frame; frame.size.height = height; self.frame = frame; } - (CGFloat)height{ return self.frame.size.height; } @end
类别(分类)的级别极高,不要覆盖定义前类定义的方法或属性 !!
#import "SAMObjectDemo+SAMCategory.h"
@implementation SAMObjectDemo (SAMCategory)
@end
类的私有扩展:
类的声明:
@interface SAMPerson : NSObject
// 在这里定义的属性和方法可以被外部访问
/**
* 年龄
*/
@property (nonatomic, assign) int age;
/**
* 名子
*/
@property (nonatomic, copy) NSString *name;
// ...
@end
类的实现:
#import "SAMPerson.h"
@interface SAMPerson()
// 在这里定义的属性和方法只能在本类中访问
// 类扩展,类的私有扩展,类延展,都是说的它 ,,可以在其内部添加实例变量(成员变量)且不会被外部访问到,
@end
@implementation SAMPerson
@end
属性的访问:
SAMPerson *per = [SAMPerson new];
per.age = 20;
per.name = @"Jobs";
NSLog(@"%d -- %@",per.age,per.name);
常见错误
(1)@interface @end和@implementation @end不能嵌套包含
(2)只有类的声明没有类的实现
(3)漏写@end
(4)两个类的声明嵌套(可以把顺序打乱)
(5)成员变量没有写在{}里
(6)方法的声明写在了{}里面
(7)在声明时对类的成员变量进行初始化,请注意成员变量不能脱离对象而独立存在
(8)方法无法像函数那样的调用
(9)成员变量和方法不能用static等关键字修饰,不要和c语言混淆
(10)类的实现可以写在mian函数后面,在使用之前只要有声明就可以
OC对象与函数
OC对象与函数有着本质的区别
:
(1)方法的实现只能写在@implementation··@end中,对象方法的声明只能写在@interface···@end中间
(2)对象方法都以-号开头,类方法都以+号开头
(3)对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用
(4)函数属于整个文件,可以写在文件中的任何位置,包括@implementation··@end中,但写在@interface···@end会无法识别,函数的声明可以再main函数内部也可以在main函数外部。
(5)对象方法归类\对象所有
(6)函数调用不依赖与对象
(7)函数内部不能直接通过成员变量名访问对象的成员变量
写的不好,不喜勿喷...
微博 @狼人的秘密