今天开始真正地学习oc的语法。发现语法和c java 差不多的。看一遍教学视频,基本都掌握了。
打开xcode,然后新建个mac的command line项目。新建一个car类,会有两个文件,一个.h文件,是类的声明;一个是.m文件,是类的实现。
.h文件中,自动生成了“@interface Car : NSObject”,NSObject是Car类的父类,冒号前面的类继承后面的类。之后的“{ }”里面用于声明类的成员变量,之后再声明方法。最后以“@end”结尾。
oc中方法的声明特别怪异,与c java完全不同。先是写一个“-”或“+”,前者代表方法是实例方法,后者代表是类的静态方法,之后是返回值类型,写在一个小括号里。然后是方法名,名称中间可以插进形参,与方法名用“:”隔开,方法名中的变量名后接着形参。行参前要写明类型,写在括号里。形参后面可以接着写方法名。例如-(int)getPersonAgeById:(int)_id;或-(float)getSpeedByDistance:(float)_distance AndTime:(float)_time;
声明完后,在.m文件中实现方法。.m文件以“@implementation Car”为开头,以“@end”结尾。调用方法时,用“[]”。例如,[调用者 方法名:参数]。
根据面向对象的原则,类的成员变量不能直接被其他类访问,要使用setter和getter。但是为每个变量都创建setter和getter很麻烦。于是可以用另一种简便的方法。在Car的.h文件中,用@property修饰变量,如@property(nonatomic) int length。然后在.m文件中写上@synthesize length,之后就可以在其他类中访问Car的成员变变量了。例如car是Car的实例,想要获得length,直接写[car length],想要修改length,可以写[car setLength:12]。
下面分别贴出Car.h Car.m main.m的代码:
// Car.h
// TestOC
//
// Created by xd on 14-3-14.
// Copyright (c) 2014年 -. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
int length;
int weight;
NSString *color;
}
-(id)init;
@property(nonatomic)int length;
@property(nonatomic)int weight;
@end
// Car.m
// TestOC
//
// Created by xd on 14-3-14.
// Copyright (c) 2014年 -. All rights reserved.
//
#import "Car.h"
@implementation Car
-(id)init{
length=10;
return self;
}
@synthesize length;
@synthesize weight;
@end
// main.m
// TestOC
//
// Created by xd on 14-3-14.
// Copyright (c) 2014年 -. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Car.h"
int main(int argc,const char * argv[])
{
@autoreleasepool {
Car *car;
car = [[Caralloc] init];
// insert code here...
NSLog(@"汽车长度%d",[car length]);
NSLog(@"汽车宽度%d",[car weight]);
}
return 0;
}
// Car.h
// TestOC
//
// Created by xd on 14-3-14.
// Copyright (c) 2014年 -. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
int length;
int weight;
NSString *color;
}
-(id)init;
-(void)run;
-(void)stop;
@property(nonatomic)int length;
@property(nonatomic)int weight;
@end
// Car.m
// TestOC
//
// Created by xd on 14-3-14.
// Copyright (c) 2014年 -. All rights reserved.
//
#import "Car.h"
@implementation Car
-(id)init{
length=10;
return self;
}
-(void)run{
NSLog(@"汽车开动了");
}
-(void)stop{
NSLog(@"汽车停止了");
}
@synthesize length;
@synthesize weight;
@end
// BYD.h
// TestOC
//
// Created by xd on 14-3-14.
// Copyright (c) 2014年 -. All rights reserved.
//
#import "Car.h"
@interface BYD : Car
-(void)run;
@end
// BYD.m
// TestOC
//
// Created by xd on 14-3-14.
// Copyright (c) 2014年 -. All rights reserved.
//
#import "BYD.h"
@implementation BYD
-(void)run{
NSLog(@"比亚迪开动了");
}
@end
// main.m
// TestOC
//
// Created by xd on 14-3-14.
// Copyright (c) 2014年 -. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Car.h"
#import "BYD.h"
int main(int argc,const char * argv[])
{
@autoreleasepool {
Car *car;
BYD *byd;
Car *car2;
car = [[Caralloc] init];
//具有自己的run方法和继承于Car类的stop方法
byd = [[BYDalloc] init];
//多态,虽然是Car类型变量,但是是BYD的实例
car2 = [[BYDalloc] init];
[carrun];
[carstop];
[bydrun];
[bydstop];
[car2run];
[car2stop];
// // insert code here...
// NSLog(@"汽车长度%d",[car length]);
// NSLog(@"汽车宽度%d",[car weight]);
}
return 0;
}