// main.m
// 定义一个类
//
// Created by admin on 15/7/22.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
/*
1. 定义一个类有三部分:
类名
要求:> 类名的首字母 必须 大写,
> 类名不能有下划线
属性(成员变量)
要求:> 属性名称必须以下划线开头
行为(方法)
2. 完整的定义一个类分为两部分:
> 类的声明
> 类的实现
*/
/*
2.1 类的声明
> 在@interface @end 之间写类的声明,@end是用来告知什么时候声明结束
> 这里需要声明的是,类的属性,和行为(方法)
> 所有需要继承顶层父类:NSObject类
*/
typedef enum
{
// k + 枚举类型 + 含义
kIColorBlack, // 黑色
kIColorWrite // 白色
}IColor;
/*
例: 类的声明
*/
// 声明属性
@interface Iphone :NSObject
{
@public // 说明成员变量是可公开访问的类型
int _cpu; // 手机的cpu
float _size; // 手机尺寸
IColor _clolr; // 手机颜色, 这里颜色使用枚举类型,并起了别名
}
/*
声明方法
> 对象方法以 - 号开头, 类方法一般用 + 开头
> 数据类型一定要用小括号括住,无论是方法的返回值类型还是方法中参数的类型
> OC方法中小括号就一个作用,用来括主数据类型
*/
- (void)aboutMyPhone; // 声明一个无返回值,无参数的关于手机信息的方法
- (char *)recepitMessage; // 声明一个有返回值无参数的接收短信的方法
- (void)sendSingal:(char *)number; // 声明一个有参数无返回值的方法,
// 注意:> 当方法有参数的时候,必须在参数类型前加上一个冒号
// > 冒号也是方法名的一部分,即这里方法名为 sendSingal:
- (void)sendMessageWithNumber:(char *)number andMessageContent:(char *)content;
// 这是一个两个参数的方法,苹果提倡我们把方法名写的跟句子一样,这里第一个参数为number 第二个为content
@end // 至此表示方法声明结束,@end 不能省略
/*
2.2 类的实现
> 主要用来实现声明当中的方法,说清楚方法中要干什么
> 在@implementation @end 之间写类的实现,@end是用来告知什么时候实现结束
*/
/*
例: 类的实现
*/
@implementation Iphone
- (void)aboutMyPhone
{
NSLog(@"查看手机信息!");
}
- (char *)recepitMessage
{
_cpu ++; // 注意:对象方法中,可以直接访问并使用对象成员
return "shou ji xin xi ";
}
- (void)sendSingal:(char *)number
{
NSLog(@"拨打电话给 %s", number);
}
-(void)sendMessageWithNumber:(char *)number andMessageContent:(char *)content
{
NSLog(@"发短信给 %s, 内容是 %s", number, content);
}
@end // 至此表示 类实现结束 @end不能省略
int main(int argc, const char * argv[]) {
/*
注意: > 在OC中如过想执行一些行为(方法),就要立即写 [类名/对象 方法名称]
> 用类名 调用的是类方法
> 用对象 调用的是对象方法
*/
/*
> 这里是调用类方法,即new方法,这个方法它继承的NSObject的方法,作用是new出一个Iphone对象
> 这句话将会做一下三件事:
①、开辟存储空间
②、初始化成员变量(写在类声明中的属性叫:成员变量 也叫做 实例变量)
③、返回指针地址 (既然返回指针,所以就必须有指针来接收这个结果)
*/
[Iphone new];
/*
> 定义一个指针变量p指向Iphone类型对象
> 指针保存了对象的地址,我们就可以把它叫做某个对象
*/
Iphone *p = [Iphone new];
/*
> OC中要想操作一个对象的属性或者行为(方法),必须通过指针来操作
> 通过指针p来操作对象中的属性、行为
*/
p->_cpu = 1;
p->_size = 4.0;
p->_clolr = kIColorBlack;
/*
> 利用对象调用对象方法,调用方法在OC中称之为“发送消息”
*/
[p sendSingal:"nihaoma"];
[p sendMessageWithNumber:"1212" andMessageContent:"zhe shi xiao xi"];
char *result = [p recepitMessage];
NSLog(@"result = %s", result);
/*
> 取出p指向对象中的属性
*/
int number = p->_cpu;
NSLog(@"cpu = %d, size = %.1f, clolr = %d", number, p->_size, p->_clolr);
/*
> 每new一次,即创建一个新的对象,都会重新开辟一块存储空间,互不干扰,
一个类只占用一块存储空间,一个类可以创建无数个对象
*/
return 0;
}
// main.m
// 类_注意点
//
// Created by admin on 15/7/22.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int age;
char *name;
float score;
}
- (char *) eat;
@end
@implementation Person
//- (char *)eat
//{
//
// return "ni chi le me ?";
//}
@end
int main(int argc, const char * argv[]) {
/*
1. 只有类的声明,没有类的实现是错误的,系统会报错
2. 声明和实现的结尾不能缺少@end
3. 类的声明中不能写实现,实现中不能写声明,必须分开写
4. 类的声明和实现不能写到某个函数里面
5. 类的成员变量必须写到声明的大括号中
6. 在声明成员变量的时候不能直接赋值
7. OC是弱语法,在没有声明只有实现的时候,是可以编译通过的(实际开发中不能这样,会带来安全隐患)
*/
/*
经典错误: 没有实现的时候系统报错
-[Person eat]: unrecognized selector sent to instance 0x100204790'
*/
Person *person = [Person new];
char *result = [person eat];
NSLog(@"result = %s", result);
return 0;
}