LHF Objective-C语法(2)类

本文深入探讨了Objective-C与Swift两种编程语言在iOS开发领域的应用,包括它们各自的优势、特点以及如何在实际项目中进行选择与使用。

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值