1.从类到对象的调用
#import <Foundation/Foundation.h>
/*
@interface 声明类时使用的关键字
Persion 类名
: 继承
NSObject OC中的基类
*/
@interface Persion : NSObject
/*
大括号内包裹类的属性
*/
{
//外部实体(对象)可以访问
@public
int age; //只允许声明,不允许初始化
int sex;
}
/*
声明类的方法
- 动态方法,对象调用。+为静态方法
(void) 返回值
run 方法名
: 参数分隔符
(int) 参数类型
i 参数名
and: 后面还有参数。and是自定义的参数描述符
*/
- (void) run;
- (void) eat:(int)i;
- (void) eatMore:(int)i and: (NSString *)food;
//必须有的结束标识
@end
/*
实现方法:
@implementation 实现方法使用的关键字
Persion 类名
*/
@implementation Persion
//方法的声明语句改除分号为大括号
- (void) run{
//功能语句
NSLog(@"跑起来");
}
- (void) eat:(int)i{
NSLog(@"吃起来,吃%d个", i);
}
- (void) eatMore:(int)i and: (NSString *)food{
NSLog(@"吃%d个%@", i, food); //%d对应int,%@对应字符串
}
//必须有的结束标识
@end
int main(){
/*
创建对象:
*p 对象指针,指向对象本身
[Persion new] 返回对象的内存地址
*/
Persion *p = [Persion new];
/*
操作属性:
(*P).age (*p)即对象,使用点方法访问属性,类似于Java
P->sex p即对象地址,使用->指向属性,同C语言中结构体指针用法
*/
(*p).age = 35;
p->sex = 0;
NSLog(@"年龄:%d", p->age);
NSLog(@"性别:%d", (*p).sex);
/*
调用方法:
OC中调用方法时必须使用中括号包裹
[对象 方法:参数 and:其它参数];
*/
[p run];
[p eat:2];
[p eatMore:1 and: @"Apple"];
return 0;
}
2.对象和自定义函数
#import <Foundation/Foundation.h>
@interface Persion : NSObject
{
@public
int age;
int sex;
}
- (void) run; //OC对象的方法声明
@end
@implementation Persion
- (void) run{
//这里最终调用实例对象的属性
NSLog(@"跑了:%d, %d", age, sex);
}
@end
// 自定义函数
void test(Persion *pp){
NSLog(@"型参pp地址:%p", pp); //0x7ff521c02c80。和main中定义的对象是同一个
pp->age = 88;
Persion *ppp = [Persion new];
NSLog(@"ppp地址:%p", ppp); //0x7ff521c0caf0
ppp->age = 64;
ppp->sex = 51;
pp=ppp;
NSLog(@"pp地址:%p", pp); //0x7ff521c0caf0。和本函数中定义的是同一个
pp->age = 99;
}
int main(){
Persion *p = [Persion new];
NSLog(@"p地址:%p", p); //0x7ff521c02c80
(*p).age = 35;
p->sex = 0;
//调用自定义函数
test(p);
NSLog(@"年龄:%d", p->age); //88
NSLog(@"性别:%d", (*p).sex); //0
[p run]; //88, 0
return 0;
}
3.OC的函数和对象方法
#import <Foundation/Foundation.h>
/*
方法的声明必须写在main之前-使用之前
*/
@interface Persion : NSObject
/*
OC对象的方法只能在定义类时声明。属于面向对象的范畴
以+、-开头
返回值类型使用()包裹
参数类型使用()包裹。如果没有参数,就直接以分号结束
*/
- (void) run;
@end
void test();
/*
方法的实现可以放在main之后
*/
@implementation Persion
//OC对象的方法只能在这里实现
- (void) run{
NSLog(@"OC对象的方法");
test(); //在OC对象的方法中,调用已经声明的普通函数
}
@end
//OC中的函数、自定义函数。不依赖于对象存在,如同C语音,是面向过程的
void test(){
NSLog(@"OC自定义函数");
}
int main(){
Persion *p = [Persion new];
[p run]; //OC对象的方法只能通过对象调用
test(); //普通函数的调用。和C一样,先声明,再使用。和OC对象没有任何关系
return 0;
}
4.各种属性
#import <Foundation/Foundation.h>
typedef enum{
sexMan,
sexWoman
}Sex;
typedef struct{
int yesr;
int month;
int day;
}Date;
@interface Dog : NSObject
{
NSString *name;
}
-(void)run;
@end
@implementation Dog
-(void)run{
NSLog(@"狗狗跑");
}
@end
@interface Persion : NSObject
{
@public //后续属性可被公开访问
Sex sex;
Date birthday;
NSString *name;
Dog *dog;
}
- (void) toString;
-(void)letDogRun;
@end
@implementation Persion
-(void) toString{
NSLog(@"姓名:%@,性别:%d,生日:%d-%d-%d", name, sex, birthday.yesr, birthday.month, birthday.day);
}
-(void)letDogRun{
NSLog(@"让狗跑,");
[dog run];
}
@end
int main(){
Persion *p = [Persion new];
p->sex = sexMan;
Date date = {1987, 3, 1};
p->birthday = date;
p->name = @"Vigiles";
p->dog = [Dog new];
[p toString];
[p letDogRun];
return 0;
}
5.OC对象方法
#import <Foundation/Foundation.h>
@interface Persion : NSObject
- (void) func1;
//- (int) func1; //返回值虽然不同,方法名仍不能相同
- (int) func1:(int)i; //这个方法的名称是func1: ,冒号也是方法名的一部分
//一个参数,对应一个冒号。这个方法的名称是func2withArg1:withArg2:withArg3:
- (int) func2withArg1:(int)i withArg2: (int)j withArg3: (int)k;
@end
@implementation Persion
- (void) func1{
NSLog(@"xxx");
}
- (int) func1:(int)i{
return i;
}
- (int) func2withArg1:(int)i withArg2: (int)j withArg3: (int)k{
return i+j+k;
}
@end
int main(){
Persion *p = [Persion new];
NSLog(@"调用无参方法");
[p func1];
NSLog(@"调用有参方法:%d", [p func1:6]);
NSLog(@"调用多参方法:%d", [p func2withArg1:9 withArg2:8 withArg3:4]);
return 0;
}
- end