首页 > 代码库 > 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)