hello.m(implementation) hello.c
#import <Foundation/Foundation.h> 引入头文件
#include <F……>
import是include的加强版,预处理只要预处理一次
编译链接:clang hello.m -framework Foundation
(-fobjc-arc 用自动引用计数编译)//终端默认为手动引用计数
(-fno-objc-arc 用手动引用计数编译)
类的声明:只能声明方法和变量(可以用汉字,但一般情况用字母,建议用_开头)
@interface Car : NSObject //Car 继承 NSObject
@end
类的实现:对接口中方法的实现
@implementation Car
//对象销毁时,系统自动调用
(- 实例、成员方法,必须实例调用:car.方法名)/(+ 类方法,类名调用)(返回值类型void)(方法名)dealloc{//类似c++析构函数
NSLog(@"%s",__func__);//__FUNCTION__
//手动引用计数必须调用,自动引用计数不能调用
[super dealloc];
}
@end
/***/
不能用sizeof测量类的大小
Car car;//error
OC的类类型只能用来定义指针//OC所有对象都分配在堆上,所以只能定义指针,不能定义普通类型的变量
Car *car = nil;//初始化,nil表示一个空对象
创建对象(OC分配内存)
Car *car = [Car alloc];//[]表示方法的调用,同c中的malloc
初始化对象
[car init];
//new相当于封装了alloc 及 init
Car *car = [Car new];
释放对象
[car release];
两种引用计数
MRC(manual reference counting手动引用计数)
ARC(automatic reference counting 自动引用计数)
ARC不能使用release及 super dealloc,会自动回收
MRC则要使用
OC中定义的变量,会自动进行初始化
访问权限设置:只能作用于变量之上
默认为受保护:@protected(自己和子类可用)
公共: @public
私有: @private(只能自己使用)
举例:
@private float _h;
char _c;//同上_c是私有变量
_开头的变量的优先级要高于同名但没有下划线的变量
如:_money优先级高于money
/***/函数指针:
typedef void (*Func)();
void y(){
NSLog(@"xxx");
}
Func x(){
return y;
}
x()();//xxx
OC中常见的宏:
__LINE__
下面三个输出打印相同
__FUNCTION__
__PRETTY_FUNCTION__
__func__
OC编码规范的约定:驼峰命名法
类名:首字母大写 CarTest
(实例、成员)变量: 下划线开头 _h
普通变量: f
不同属性的定义:
property//oc特有的规则
attribute//成员变量,物体的属性
OC没有静态成员变量(即不用+开头)
//实例(instance,对象-object)方法,成员方法
- (void) test;
//类方法
+ (void) test;
冒号也是方法名的一部分
- (void)test3;
- (void)test3:(int)a;
- (void):(int)a;
[car test3];
[car test3: 234];
[car : 456];
类函数中不可以修改类中的变量进行操作,而成员函数可以
NNString *_name;//字符串类型,赋值@"";
%@ //NNString 类型输出格式
封装(约定格式)
.h
@interface Car : NSObject
{
@private
int _money;
}
- (void)setMoney:(int)money;
- (int) money;
@end
.m
- (void) print{
NSLog(@"print");
}
- (void) setMoney:(int)money{
_money = money;
[self print];//调用类中的方法
}
- (int) money
{
return _money;
}
main()
{
Car *car = [Car new];
car.money=12;//调用setMoney
NSLog(@"%d",car.money);//调用money
}
继承:实现可重用性
OC支持单继承(只有一个父类)
通过self.变量名访问父类私有变量
多态:同一父类的不同子类可以重载父类的方法,实现不一样的功能
可以用父类的指针指向子类的对象,但子类指针不可以指向父类的对象,根据指针类型而定
collegeStu *stu = [[Student alloc] init];(wrong)
Student *stu1 = [collegeStu new];(right)
总结:大学生一定是学生,但学生不一定是大学生
编译时类型:指针的类型
运行时类型:实际所指向的类型(运行时绑定)
[stu1 release];后要将指针置为空(st1 = nil;)