OC简单介绍01

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)函数内部不能直接通过成员变量名访问对象的成员变量

写的不好,不喜勿喷...

微博 @狼人的秘密

时间: 2024-11-07 13:36:33

OC简单介绍01的相关文章

Android Interface(UI) 界面控件简单介绍01

1.TextView:显示文本 常用的属性设置:android:textIsSelectable="true" 设置文本内容可选(触发系统的复制粘贴功能)android:drawableLeft="@mipmap/ic_launcher" 设置文本内容的图标其它包括drawableRight, drawableTop, drawableBottom, drawableStart, drawableEndandroid:text="Hello World!&

iOS开发——图形与动画篇OC篇&amp; POP简单介绍及使用

POP简单介绍及使用 前言 动画在APP开发过程中 大家多多少少都会接触到 而且随着ios7的扁平化风格启用之后 越来越多的APP开始尝试加入各种绚丽的动画交互效果以增加APP的用户体验(当然 还是以国外的APP居多) 有过相关开发经验的同学肯定知道在iOS中 动画相关的部分都是基于Core Animation 但是今天我们不讨论Core Animation 今天的主角是POP -来自于Facebook的动画引擎(其实我不喜欢把POP定义为动画引擎 我愿意称它为函数发生器) 介绍 官方地址 ht

iOS开发——实用技术OC篇&amp;?Invocation简单介绍

Invocation简单介绍 方法一:运行时方法:(这里在之前的文章定时器的几种方法中说过:www.cnblogs.com/iCocos/p/4694581.html) 1:创建一个签名: NSMethodSignature *singature = [NSMethodSignature signatureWithObjCTypes:"[email protected]:"]; 这里我想如果你仔细的话肯定注意到了:后面的“[email protected]:”,这里是运行时的语法在这里

OC基础(十二)内存简单介绍和OC的内存管理

一.内存简单介绍 内存结构 1.运行时分配 (1)栈:用户存放程序临时创建的局部变量(先进后出). (2)堆:动态分配内存段. 2.编译器分配 (1)BSS段:存放未初始化的全局变量和静态变量. (2)数据段:已初始化的全局变量和静态变量. (3)代码段:执行代码的一块区域. 地址由低到高:代码段 -> 数据段 -> BSS段-> 堆 -> 栈 内存分配方式 1.从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量

iOS开发——网络OC篇&amp;网络爬虫简单介绍

网络爬虫简单介绍 先来看看网络爬虫的基本原理: 一个通用的网络爬虫的框架如图所示: 网络爬虫的基本工作流程如下: 1.首先选取一部分精心挑选的种子URL: 2.将这些URL放入待抓取URL队列: 3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中.此外,将这些URL放进已抓取URL队列. 4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环. 以下内容均为本人个人

iOS开发——UI精选OC篇&amp;UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道,单例在应用程序的整个生命周期中只有一个对象). App的启动过程 打开程序之后-> 1:Main函数 2:UIapplicationMain函数 3:初始化UIApplication(创建) 4:设置UIApplication代理和相应的代理属性 5:开启事件循环,监听系统事件 6监测info.p

iOS开发——网络编程OC篇&amp;(一)XMPP简单介绍与准备

XMPP简单介绍与准备 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容. 有许多的IM系统,如AOL IM.Yahoo IM. MSN以及QQ,它们最大的区别在于各自通讯协议的实现,所以即时通讯技术的核心在于它的传输协议. 协议用来说明信息在网络上如何传输,如果有了统一的传输协议,那么应当可以实现各个IM之间的直接通讯,为了创建即时通讯的统一标准,目前已经出现过

iOS开发RunLoop学习:一:RunLoop简单介绍

一:RunLoop的简单介绍 #import "ViewController.h" @interface ViewController () @end @implementation ViewController /** * 1:Runloop和线程的关系:1:一一对应,主线程的runloop已经默认创建,但是子线程的需要手动创建:创建子线程的runloop: NSRunLoop *run = [NSRunLoop currentRunLoop];currentRunLoop懒加载的,

Object-c集合的简单介绍

一.简单介绍 NSArray/NSMutableArray NSSet/NSMutableSet NSDictionary/NSMutableDictionary NSArray.NSSet.NSDictionary是不可变的,创建的时候初始化 NSMutableArray.NSMutableSet.NSMutableDictionary是可变的 二.使用介绍 NSArray是有序的数组 NSMutableArray *myArray=[[NSMutableArray alloc] init];