03-OC类的声明与实现

描述OC中的类跟函数类似,函数有分声明和定义,分2大步骤:类的声明、类的实现(定义)。

一.@interface和@implementation的分工

  • @interface就好像暴露在外面的时钟表面

  • @implementation就好像隐藏在时钟内部的构造实现

1.     类的声明

1)       代码编写

  • 定义一个Car类,拥有2个属性:轮子数、时速,1个行为:跑
  • 类名\属性的命名规则:标示符的规则
  • 类名的命名规范:有意义、驼峰标识、首字母大写
#import <Foundation/Foundation.h>
// 类的声明
@interface Car : NSObject
{
    @public
    int wheels; // 多少个轮子
    int speed; // 时速
}
- (void)run; // 跑的行为
@end

2)    成员变量

  • @interface的大括号{}中声明的变量:wheels、speed
  • @interface的大括号和函数的大括号是不一样的
  • 默认会初始化为0 

3)   @public

@public可以让Car对象的wheels和speed属性被外界访问

4)   NSObject

加上:NSObject的目的是让Car类具备创建对象的能力    ps:老乔当年被人挤兑出苹果,自立门户的时候做了个公司叫做NextStep,开发NextStep的人们比较自恋地把函数库里面所有的类都用NextStep的缩写打头命名。

2. 类的实现

// 类的实现
@implementation Car
- (void) run
{
    NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);
}
@end

3.创建对象(es:在main函数里)

1)    代码编写

// 主函数
int main()
{
    // 创建车子对象
    Car *c1 = [Car new];
    c1->wheels = 3;      // oc里面只能通过指针间接访问成员变量
    c1->speed = 300;   
    [c1 run];
  Car *c2 = c1; // 将c1的指针赋值给c2,然后修改wheels的值
   c2->wheels=4;
return 0; }

2)  main函数的代码分析、内存分析(对象在内存中有成员)

  • [Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址

Car *c = [Car new];

用一个指针变量c指向内存中的Car对象   

  • 设置车子对象的属性

跟用指向结构体的指针访问结构体属性一样,用->

c->wheels = 3;

c->speed = 300;

 

4.        常见错误

  •    只有类的声明,没有类的实现
  •    漏了@end
  •    @interface和@implementation嵌套
  •    两个类的声明嵌套
  •    成员变量没有写在括号里面
  •    方法的声明写在了大括号里面

 

5.        语法细节

  •    成员变量不能在{}中进行初始化、不能被直接拿出去访问
  •    方法不能当做函数一样调用
  •    成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)
  •    类的实现可以写在main函数的后面,声明只有在main函数前面就行了

 

6.        OC方法和函数的区别

  •    OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
  •    C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
  •    C函数不能访问OC对象的成员
  •    低级错误:方法有声明,但是实现的时候写成了函数

 

7.   OC的方法注意

  •    方法只有声明,没有实现(经典错误)
  •    方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)
  •    编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告

8.    关于@implementation

  • 没有@interface,只有@implementation,也是能成功定义一个类的
@implementation Car : NSObject
{
    @public
    int wheels; // 多少个轮子
    int speed; // 时速
}

- (void) run
{
    NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);
}

@end
  • @implementation中不能声明和@interface一样的成员变量

 

posted on 2014-04-18 00:36  ゴルツの惠斌纳閣下  阅读(220)  评论(0编辑  收藏  举报