/*
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; //这个函数可以重载
@end
Person.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;
}
@end
main.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;
}