Fraction.h (分数)
#import <Foundation/Foundation.h>
static int t= 0;
@interface Fraction : NSObject{
int numerator; //分子
@public int denominator; //分母
}
-(void) setNumerator:(int) numerator;
-(void) setDenominator:(int) denominator;
-(void) setNumerator:(int) numerator andDenominator:(int) denominator;
-(int) numerator;
-(int) denominator;
-(void) print;
+(void) t;
@end
解释:
1、#import <Foundation/Foundation.h>导入系统头文件 #import "Other.h" 导入普通头文件
2、类变量定义在接口外,类变量只能本类访问
3、花括号里是实例变量 访问修饰符可以是 @public @protected @private
4、默认是@protected 除了实例变量有访问修饰符,其他(类变量,类方法,成员方法)都没有
5、所以方法都是公有的,所以类变量都是私有的
6、- 为成员方法 + 为类方法
7、大多类方法都是被用来初始化对象的
Fraction.m
//================================================
#import "Fraction.h"
@implementation Fraction
-(void) setNumerator:(int) n{
numerator = n;
}
-(void) setDenominator:(int) d{
denominator = d;
}
-(void) setNumerator:(int) n andDenominator:(int) d{
numerator = n;
denominator = d;
}
-(int) numerator{
return numerator;
}
-(int) denominator{
return denominator;
}
-(void) print{
NSLog(@"%d/%d",numeraotr,denominator);
}
-(void) m{
NSLog(@"-m:The class varable t is %d",++t);
}
+(void) t{
NSLog(@"+t:The class varable t is %d",++t);
}
@end
1、m方法没有在头文件中声明,也可以调用
2、方法的本地变量(参数,方法中定义的变量)改成缩写了,防止重名。在名称冲突情况下,会隐藏实例变量
int main(int argc,const char * argv[]){
Fraction *frac = [[Fraction alloc] init];
[frac setNumerator:3 andDenominator:5];
[frac print];
NSLog(@"The denominator of Fration is %d\n",frac->denominator);
[Fraction t];
[frac m];
[frac release];
return 0;
}
1、第5行调用了成员变量denominator(因为是public的) numerator是protected 只能本类,子类访问
2、第6行 调用了类方法,也可以用下边方法调用类方法
[[Fraction class] t];
Class clazz = [Fraction class]; [clazz t]; clzaa是指针,没有*
3、第7行 m方法,未在头文件中声明,这里也可以调用,相当私有化了
4、第7行 释放了frac 申请的内存空间
5、属性访问器(@property)
//Person.h头文件================================
#import <Foundation/Foundation.h>
@interface Person :NSObject{//创建类
NSString *name;//属性
int age;//属性
}
-(void) setName:(NSString*) n;//要吧这3个方法用属性访问器替换掉
-(void) setAge:(int) a;
-(NSString*) name;
-(void) print;
@end
//Person.m实现文件================================
@implementation Person
-(void) setName:(NSString*) n{
[ n retain];
[name release];
[name = n];
}
-(void) setAge:(int) a{
age = a;
}
-(NSString*) name{
return name;
}
-(void) print{
NSLog(@"This is a method...");
}
@end
//main.m================================
int main(int argc,const char * argv[]){
Person person ;
person = [[Person alloc] init];
[person setName:@"Tom"];
[person setAge:22];
[person print];
[person release];
}
用属性访问器,简化上边代码
参考地址:http://skyoceanone.blog.51cto.com/3483859/687268
//Person.h头文件================================
#import <Foundation/Foundation.h>
@interface Person :NSObject{//创建类
NSString *name;
int age;//属性
}
@property (retain) NSString* name;//set get方法简化
@property (assign) int age;//set方法简化
-(void) print;
@end
//Person.m实现文件================================
@implementation Person
@synthesize name;
@synthesize age;
-(void) print{
NSLog(@"This is a method...");
}
@end
//main.m================================
int main(int argc,const char * argv[]){
Person person ;
person = [[Person alloc] init];
person.name=@"Tom";
person.age = 22;
[person print];
[person release];
}
@property(属性访问器类型) 实例变量类型 实例变量@property(nonatomic,assign) int numerator;
@property float count; //
@property(nonatomic,assign,getter=isMale) BOOL male;
属性访问器类型
assign / retain / copy 普通赋值/带计数器的赋值/拷贝
readonly /readwrite 只读(不生成getter方法)/ 读写
nonatomic 线程不安全(默认线程安全)
getter/setter 给生成的方法起名
另一个例子:
//旧文件
#import <Foundation/Foundation.h>
#import "Tire.h"
@interface AllWeatherRadial :Tire{
float rainHanding; //轮胎气压
float snowHanding; //花纹深度
}
-(void) setRainHandling:(float) rainHanding;
-(float) rainHanding;
-(void) setSnowHandling:(float) snowHandling;
-(float) snowHandling;
@end //AllWeatherRadial
//新文件,简化了代码=======================================
#import <Foundation/Foundation.h>
#import "Tire.h"
@interface AllWeatherRadial :Tire{
float rainHanding;
float snowHanding;
}
@property float rainHandling;//优化后的setter getter 方法
@property float snowHandling;
@end
#import "AllWeatherRadial.h"
@implementation AllWeatherRadial
-(id) initWithPressure:(float) p treadDepth:(float) td{
if(self =[super initWithPressure: p
treadDepth: td]){
rainHandling = 23.7;
snowHandling = 42.5;
}
return (self);
}
-(void) setRainHandling:(float) rh{
rainHandling = rh;
}
-(float)rainHandling{
return rainHandling;
}
-(void) setSnowHandling:(float)sh{
snowHandling = sh;
}
-(float) snowHandling{
return snowHandling
}
-(NSString*) description{
NSString* desc;
desc = [[NSString alloc] initWithFormat:
@"AllWeatherRadial:%.1f/%.1f/%.1f/%.1f",
[self pressure],[self treadDepth],
[self rainHandling],
[self snowHandling]];
return desc;
}
@end
//新文件简化了代码
#import "AllWeatherRadial.h"
@implementation AllWeatherRadial
@synthesize rainHandling;
@synthesize snowHandling;
-(id) initWithPressure:(float) p treadDepth:(float) td{
if(self =[super initWithPressure: p
treadDepth: td]){
rainHandling = 23.7;
snowHandling = 42.5;
}
return (self);
}
-(NSString*) description{
NSString* desc;
desc = [[NSString alloc] initWithFormat:
@"AllWeatherRadial:%.1f/%.1f/%.1f/%.1f",
[self pressure],[self treadDepth],
[self rainHandling],
[self snowHandling]];
return desc;
}
@end
//main====================================================
int main(int argc,const char * argv[]){
Car *car = [[Car alloc] init];
int i;
for(i=0;i<4;i++){
AllWeatherRadial *tire;
tire = [[AllWeatherRadial alloc] init];
[tire setRainHandling:20+i];
[tire setSnowHandling:28+i];
NSLog(@"the tire's handling is %.f %.f",
[tire rainHandling],
[tire snowHandling]);
[car setTire:tire atIndex:i];
[tire release];
}
Engine *engine = [[Slant6 alloc] init];
[car setEngine:engine];
[car print];
[car release];
return 0;
}//main