首页 > 代码库 > Objective-C学习笔记(1)

Objective-C学习笔记(1)

oc(objective-c简称)

建立在C语言的基础上,增加了一层最小的范围的面向对象的语法(保留了面向对象最精华的部分,oc的内容没有java多,而java的内容没有c++多,c++的内容最为繁杂)

OC完全兼容C语言,c和oc可以混编。可以在OC代码中混入C语言代码(前提是oc源文件扩展名是.m),甚至是C++代码(不是所有的源文件都能包含c++代码,只有源文件扩展名是.mm的源文件可以包含c++代码)。可以使用OC开发Mac OS X平台和iOS平台的应用程序

 

关键字

基本上所有关键字都是以@开头,一些常见的关键字

@interface、@implementation、@end

@public、@protected、@private、@selector

@try、@catch、@throw、@finally 

@protocol、@optional、@required、@class

@property、@synthesize、@dynamic

self、super、id、_cmd、__block、__strong、__weak

 

字符串以@开头

比如@"Hello"是OC中的字符串,而"Hello"则是C语言中的字符串

其中,@和字符串必须紧挨着。

 

其他语法

 

OC程序的开发过程

 

编辑,编译,链接(把所有的相互关联的.o文件合并在一起,加上函数库),运行。和c类似,先编写.m文件,然后编译器编译,链接,运行。

 

OC完全兼容C语言

跟C语言一样,OC(objective-c)程序的入口依然是main函数,只不过写到一个.m文件中(文件名可以是中文)。

 1 #include <stdio.h> 2  3 //oc程序的入口函数也是main函数 4  5 int main(void) 6  7 { 8  9     printf("第一个oc程序!oc源文件完全兼容c语言!");10 11     return 0;12 13 }

编译cc –c main.m,链接cc main.o,运行./a.out

使用NSLog函数输出内容

1 #import <Foundation/NSObjCRuntime.h>2 //不是#include,而是#import3 int main(void)4 {5     //NSlog输出内容自动换行6     NSLog(@"第二个oc程序!!");7     return 0;8 }

编译cc –c main.m

链接cc main.o –framework Foundation

注意:oc程序的链接,只是把c的库函数自动链接,而oc自己的库函数,需要链接的时候写上:–framework Foundation,只要用了foundation框架,就得写。

运行./a.out

NSLog与printf的区别

NSLog接收OC字符串作为参数,printf接收C语言字符串作为参数

NSLog输出后会自动换行,printf输出后不会自动换行

使用NSLog需要#import <Foundation/Foundation.h>,里面有NSLog函数的声明。不需要刻意记忆,想不起来,就编译,出错就会提示缺少什么。

可以只包含框架的主头文件,效果等价包含了这个框架里的所有的头文件。头文件在Xcode里面,路径很深,不好找。

使用printf需要#include <stdio.h>

#import的作用(预处理)

1、跟#include一样,用来拷贝某个文件的内容

2、可以自动防止文件内容被拷贝多次,也就是头文件中不用和C一样,加入下面的预处理指令了

#ifndef  xxx xxx

#define xxx xxx

#endif

Foundation框架的作用

开发iOS、Mac程序必备的框架,此框架中包含了很多常用的API(应用编程接口)。框架中包含了很多头文件,若想使用整个框架的内容,包含它的主头文件即可

#import <Foundation/Foundation.h>

BOOL的使用(完全可以当做整型用)

BOOL类型的本质:typedef signed char BOOL;

BOOL类型的变量只有两种取值:YES、NO

#define YES (BOOL)1

#define NO  (BOOL)0

BOOL的输出(当做整数来用);NSLog(@"%d %d", YES, NO);//1 0

C里没有布尔类型,c++里有,oc也有。不过oc的布尔和c++有区别,在C++里一切非 0 值的东西都为 true,而为0值的为false。但是Object-c里必须是1为 true ,且并被宏定义为 YES,0 为 false 并被宏定义为 NO。所以下面的代码,则肯定是得不到想要的运行顺序。

 1 #import <Foundation/Foundation.h> 2 BOOL isBool(int, int); 3  4 int main(void) 5 { 6     if (isBool(5, 1) == YES) { 7         NSLog(@"ok"); 8     } 9     return 0;10 }11 BOOL isBool(int x, int y)12 {13     return x - y;14 }

4不是1,在oc里永远都不会等于YES(YES就是1),注意:BOOL大写,YES NO也是大写,YES就是1,NO就是0

多个.m文件的开发

跟C语言中多文件的开发是一样的,回忆c多文件开发,常量的定义或者函数的声明写在xxx.h文件,函数的定义写在xxx.c文件,主文件main.c里写主程序和函数调用,最后#include xxx.h文件,一起编译主文件main.c和xxx.c文件即可。

编写3个oc文件

main.m

#import "one.h"int main(){    test();    return 0;}

one.h

void test();

one.m

#import <Foundation/Foundation.h>void test(){    NSLog(@"调用了test函数");}

编译:cc –c main.m test.m  (两个文件要一起编译)

链接:cc main.o test.o –framework Foundation

运行:./a.out

.m文件和.c文件混用开发

main.m

#import "one.h"int main(){    test();    return 0;}

one.h

void test();

one.c

#include <stdio.h>void test(){    printf("调用了test函数\n");}

编译:cc –c main.m one.c

链接:cc main.o test.o (没有使用Foundation框架的话,就不用-framework Foundation)

运行:./a.out

 

Objective-C学习笔记(1)