/*
1.扩展名
.c C文件
.cc,.cpp C++文件
.h 头文件
.m objective-c原文件
.mm objective-c++原文件
2.和swift不同,OC不支持嵌套的/*注释
3.常用类
NSString
NSNumber 可以表示整数,float,double
上面两个基本类型一旦定义之后,其值不可以改变。
NSString提供一个mutable版本,NSMutableString
4.再定义每个类时,如果没有其他的继承,则必须继承NSObject类。
5.id是OC中定义的一个特殊类型,可以代表任意类型类似 NSObject * void *
nil = NULL
6.bool变量 YES NO
7.和swift一样只支持但继承,协议支持多继承。
8.OC中所有的成员函数都是虚函数
9.异常处理块@try @catch @finally
10.用#import包含头文件,包含C语言中的防止重复包含语句。
#ifndef 。。#define #endif
11.@public @protected @private和C++类似,默认的数据是@protected的
@private的变量不能被子类继承
12.OC中的重载识别的是函数名+标签,不区分函数类型和参数类型
13.只在类文件中定义的类方法,作为默认私有的函数。不能通过实例来使用。
*/
Person.h
@interface Person: NSObject //带property修饰符的成员变量默认是public的,其他对象可以修改之。 @property NSString *personFirstName; @property NSString *personLastName; @property int yearOfBirth; //只读属性的定义方法 @property (readonly) NSString *readonlyName; //给所有人统一进行编号 +(int) getPersonNumber; //所有以init开头的函数作为构造函数使用 -(id) init:(NSString *)firstname secondname:(NSString *)secondname; //对象作为返回值时,也必须用指针 -(NSString *) getFirstName; -(NSString *) getLastName; //-表示实例方法,+表示类方法 //(void)返回值,参数(Type)paraname 其中参数名字定义和声明可以不同。 // 和swift类方法一样,第二个参数开始必须加ExtenalParameter // 如果参数是一个对象的话,必须传指针 -(void) setName:(NSString *)first sencondParaExtenalPara:(NSString *)second; //重载中,OC中的函数识别的是函数名+标签,下面的函数和上面的一样setName:secondParaExtenalPara //所以编译会报错,重名函数 //-(void) setName:(NSString *)first sencondParaExtenalPara:(int)second; -(void) setName:(NSString *)first second:(NSString *)second; //这个函数可以重载 @endPerson.m
#import <Foundation/Foundation.h> #import "Person.h" //类实现部分,继承的书写类是可选的。 @implementation Person : NSObject static int staticGlobalPersonNumber; //所有以init开头的函数作为构造函数使用 -(id) init:(NSString *)firstname secondname:(NSString *)secondname { if ( self = [super init] ) { self.personFirstName = firstname; self.personLastName = secondname; } return self; } +(int) getPersonNumber { //类方法不能访问实例属性,可以访问静态变量 return staticGlobalPersonNumber; } //参数名字可以跟声明时不一样 声明时是first,second -(void) setName:(NSString *)para1 sencondParaExtenalPara:(NSString *)para2 { //函数定义中操作的是para2,在调用的时候第二个参数需要加上sencondParaExtenalPara self.personFirstName = para1; self.personLastName = para2; } //函数重载 函数+label区别 -(void) setName:(NSString *)para1 second:(NSString *)para2 { //调用内部私有属性实现,注意这个标签是匿名的 [self innerFunction:para1 :para2]; } -(NSString *) getFirstName { return _personFirstName; } -(NSString *) getLastName { return _personFirstName; } //匿名标签的内部函数,只要在interface头文件中不声明,通过实例就不能调用 -(void)innerFunction:(NSString *)p1 :(NSString *)p2 { self.personFirstName = p1; self.personLastName = p2; } @endmain.m
#import <Foundation/Foundation.h> //C语言相同标准库<>,自己的头文件用“” #import "Person.h" //C语言中的一切都可以使用。 void func() { printf("test\n"); } int main(int argc, const char * argv[]) { func(); @autoreleasepool // 被包含在这个括号内的新建对象会被自动释放 { int test = 5; // %d 表示10进制数字,OC中新加了一个 %@ 表示对象。 // %@属性再NSObject中实现,返回对象的地址或内存的地址,子类可以重载, // 比如NSString重载为返回字符串 NSLog(@"test is :%d", test); //@的字符串为NSString类型 //定义和初始化的方法 Person *p = [Person alloc]; //分配内存 p = [p init]; //初始化函数 //也可以这样写 // Person *p2 = [[Person alloc] init]; //当然简单的方法还是有的 // Person *p3 = [Person new]; //这种函数调用方法,实在是很难适应 [p setName: @"new" sencondParaExtenalPara:@"name"]; //下面只有在类实现文件中定义了,没有在.h头文件中声明,所以不能在外部调用。 //[p innerFunction: @"inner" :@"inner"] NSLog(@"%@", [p getLastName]); p = [p init:@"Firstname" secondname:@"SecondName"]; NSLog(@"%@", [p getLastName]); //在以前需要手动释放alloc的对象,现在不需要了 //[p release]; } return 0; }