Objective-c学习笔记1(GeekBand)

1.用Objective-C实现第一个Hello GeekBand程序:

在Xcode新建工程(相信这个不难做,这里不多说),保存工程名为:Hello -YUZHIBOYI.m。程序如写:

[plain]view plaincopy

#import

int main(int argc, const char*argv[ ]) {

NSLog(@”Hello,GeekBand!!!”);

return(0);

}//在Xcode控制台可以看到输出:Hello,GeekBand!!!

现在来详细分析一下这个程序的结构:

(1)首先可以看到第一行#import,意思是使用头文件来包含元素声明,#import是GCC编译器提供的,其实也可以使用像C一样#include,不过很少这样用,因为如果用#include有可能出现重复包含头文件的情况,而#import可保证头文件只被包含一次,而不论次命令实际上在文件中出现多少次。

(2)Foundation是一个框架,它是Cocoa的组成框架之一,这个框架主要是处理用户界面之下的层中的特性,比如数据结构和通信机制。Foundation是一个主头文件。

(3)NSLog(@”Hello,GeekBand!!!”);跟C里面的printf用法类似,首先来看看NS的含义,这个前缀告诉你的函数来自Cocoa而不是其他工具包,然后是@这个符号的作用,这个符号是Objective-C在标准C基础上添加的特性之一,在字符串前加一个@ 符号,表示引用的字符串应该作为Cocoa的NSString元素来处理。

其他部分和C的语言基本一样,不多作解释~

2.布尔类型:

Objective-C的布尔类型BOOL,它具有YES和BNO值,在编写程序的时候可以C里的布尔类型与Objective-C的布尔类型共存,但值得注意的是编写Cocoa代码时要使用BOOL。

(1)BOOL实际上是一种对带符号类型的定义,它使用8位存储空间,YES定义为1,NO定义为0.

(2)应该注意一个字节长度问题是:当将一个长于1字节的整形值(如int值)赋给一个BOOL变量,这时只有低位字节会用作BOOL值。

(3)例子,一个比较两个整形数是否不同,不同返回YES,否则NO。

[plain]view plaincopy

#import

BOOLareDifferent(int a,int b){

if(a == b){

return(NO);

}else{

return(YES);

}

}//判断是否不同

NSString*boolString(BOOL yesNo){

if(yesNo == NO){

return(@”NO”);

}else{

return(@”YES”);

}

}//返回YSE或NO

int main(int argc,const char *agv[ ]){

BOOLareABDifferent;

areABDifferent = areDifferent(3,3);

NSLog(@”are %d and %d different? %@”, 3,3,boolString(areABDifferent));

areABDifferent = areDifferent(8,9);

NSLog(@”are %d and %d different? %@”, 8,9,boolString(areABDifferent));

return(0);

}//运行结果为:are 3 and 3 different? NO

are8 and 9 different? YES

这里唯一值得注意的是:NSlog()的字符串结尾,可以看到另一个@符号,这里表现为%@,它的意思是,表示boolString()返回一个NSString指针,printf()不能使用NSString,所以没我们能够使用的格式说明符NSlog()的编写者添加%@格式说明符。

2.基础语法

Objective c是面向对象的

1、#import(引入头文件)语法

eg:#import

#import”SelfClass.h”

@classSelfClass

备注:<>只在系统文件中查找,””先在本地查找,没找到则到系统文件中查找,import可自动防止同一个文件被导入多次。实例变量类型一般用@class引入,这个可以缩短编译时间,一般用在interface中,里面的方法和变量不可用。

2、字符串NSString

@”字符串”

3、BOOL布尔类型

有YES和NO两个值,备注:大于0的数不一定是YES。

4、控制台输出NSLog()

%@输出NSString等对象的值

3.类的定义和实现

1、@interface用于定义接口类

接口一般在.h文件(头文件)中定义,用来展示类的构造。

Eg:定义基于NSObject类的Circle类

@interfaceCircle :NSObject

{

ShapeColor *fillColor;

}

-(void) draw;

-(void)setFillColor: (ShapeColor *) fillColor secondName:(int) index;

@end

1)、大括号内的变量为类的实例变量(只在对象的实例中有效,所以称为实例变量ivar),后面的为方法声明。备注:c函数原型中没有先行短线。

2)、方法返回类型与C函数有相同的类型:标准类型(整型、浮点型、字符串)、指针、引用对象和结构体,如果方法使用参数则需要冒号,否则不需要冒号。没有声明实例变量时,无需大括号。

3)、上面多参数方法定义,也可以不需要secondName,但不推荐这样使用。

4)、有些方法的声明是先行加号,这样的方法为类方法(class method),这个方法属于类对象(而不是类的实例对象),类似于静态方法,通常用于创建新的实例,我们称这种用来创建新对象的类方法为工厂方法。

5)、在对象类型的右边都有一个*号,所有的对象变量都是指针类型。id类型(任意类型)已经被预定义为指针类型,所以不需要再加一个*号。

2、@implementation

实现类一般在.m文件(实现文件)中实现,实现了接口所声明的所有方法。

Eg:上面Circle的实现类

@import “XXX.h”//引入上面定义的头文件

@implementationCircle

– (void)setFillColor: (ShapeColor *) c

{

fillColor = c;

}

3、对象的实例化

1)、Circle *circle = [Circle new];//不建议这样使用

2)、Circle *circle = [[Circle alloc]init];//一般这样初始化

4、方法的调用

[ciclesetFillColor: kRedColor];//备注中间是空格

5、实例变量作用域的指令:

@protected实例变量可被该类及任何子类中定义的方法直接访问(默认的情况)。

@private实例变量可被定义在该类的方法直接访问,不能被子类定义的方法直接访问。

@public实例变量可被该类中定义的方法直接访问,也可被其他类或模块中定义的方法访问。使得其他方法或函数可以通过(->)来访问实例变量(不推荐用)。

@package 对于64位图像,可以在实现该类的图像的任何地方访问这个实例变量。

6、继承

@interface Circle: NSObject

不支持多继承,但Objective-C通过其它特性达到多继承的效果,例如类别和协议。

7、复合(composition)

复合就好像音乐中的作曲一样:将多个组件组合在一起,配合使用,从而得到完整的作品。严格来说,只有对象间的组合才能叫复合。

复合类之间的关系为“has a”。备注:在Objective-C中,复合是通过包含作为实例变量的对象指针实现的。

Eg:汽车有4个轮胎和一台发动机。

@interface  Car:NSObject

{

Engine *engine;

Tire *tire[4];

}

备注:为新建的Car对象分配内存时,这些指针将被初始化为nil(零值)

    原文作者:poo_om
    原文地址: https://www.jianshu.com/p/fa2a5613552b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞