OC基本语法

OC的基本语法

点语法

OC的点(.)语法本质还是方法调用,其在实现的时候调用set和get方法 例如:

先声明一个Person类。声明age的set和get方法

@interface Person : NSObject{
	NSInteger _age;
}

- (void)setAge(NSInteger)age;
- (void)age;

@end


实现set和get方法

@implementation Person

- (void)setAge(NSInteger)age{

	_age = age;

}
- (void)age{
	return _age;
}

@end

在main.m函数中创建一个对象,并调用set和get方法

Person *p = [[Person alloc]init];

// p.age 调用了age的set方法,等同于 [p setAge:10]
p.age = 10;

// 在NSLog()函数中的p.age调用的是get方法,等同于[p age]
NSLog(@“%ld”,p.age);

点语法在OC中很常用,但是,点语法的使用要格外的小心,因为点语法放到set和get方法的实现中使用有可能会导致死循环


实例变量的作用域

分为四个:

@public
@protected
@private
@package

@public 在任何地方都可以直接访问对象的实例变量

1.在类的内部(也就是.m 和 .h 文件内)访问: 使用 实例变量名

2.在类的外部:使用 对象->实例变量名

@public使用的比较少,因为它破坏了OC中封装的特性。

@protected 能在当前类和子类的对象中直接访问 (@interface中实例变量默认的是@protected)

@private 只能在当前类的对象方法中直接访问

@package 只要处于同一个框架中,就可以直接访问对象的实例变量,,不常用


@property 和 @synthesize 用法

在@interface…@end 中我们经常这样声明实例变量和set、get方法

@interface Person : NSObject{

	NSString *_name;
	NSInteger _age;

}

- (void)setName:(NSString)name;
- (void)name;

- (void)setAge:(NSIntger)age;
- (void)age;	

@end

现在有了@property就不用这么声明了,可以这么写:

@interface Person:NSObject{

	NSString *_name;
	NSInteger _age;
		
}

@property NSString *_name;
@property NSInteger _age;

@end 在代码中,set和get方法的声明被@property替换,简单易操作,需要注意的是,*@property 只能写在@interface中*

声明已经写好了,剩下的就是实现部分。

按之前写的方法我是这么写:

@implementation Person
//_name  的set和get方法实现
- (void)setName:(NSString)name{
	
	_name = name;

}
- (void)name{

	return _name;	

}

//_age  的set和get方法实现
- (void)setAge:(NSIntger)age{
	
	_age = age;

}
- (void)age{

	return _age;	

}

@end

set和get方法的实现方法好多,随着实例变量的增加也会越来越多,这时,就可以使用 @synthesize 来搞定这么一大堆的代码。

@implementation Person

@synthesize NSString name = _name;
@synthesize NSInteger age = _age;
//这里还可以在简化下,写成:@synthesize NSString name = _name,age = _age;

@end


//@synthesize property 可以自动生成set和get方法的实现 ​	

@synthesize NSString name = _name;

这行代码会自动生成heigth的set和get方法的实现,并且会访问_name这个实例变量,如果在@interface中不存在 _name这个实例变量,就会自动生成@private类型的_age实例变量

name是实现@interface 中的@property 中name _name访问的是实例变量中的_name

如果不慎写成@synthesize age; 也不用担心, 它会直接访问@interface中相同名字的实例变量,,,如果没有这个age,就自动生成@private类型的实例变量

优化后的@interface 和 @implementation 中的代码是可以这样的:

@interface Person:NSObject{

	NSString *_name;
	NSInteger _age;	

}

@property NSString *_name;
@property NSInteger _age;

@end


@implementation Person

@synthesize name = _name;
@synthesize age = _age;

@end

如果还嫌不够简洁的话,还有一个更简洁的写法:

在@interface 中没有实例变量,@implementation中也没有@synthesize

可以直接写:

//声明

	@interface Person:NSObject

	@property NSString *_name;
	@property NSInteger _age;

	@end

//实现

	@implementation Person

	@end

在声明部分,只写了

	@property NSString *_name;
	@property NSInteger _age;

在实现部分什么也没有写

这种情况下

@property 自动生成了@private类型的实例变量_name,并声明set和get方法,实现set和get方法 @property 自动生成了@private类型的实例变量_age,并声明set和get方法,实现set和get方法

id类型 id类型是一个万能指针,可以操作任何OC对象,只适用于OC对象

在main.m中创建一个对象

Person *p = [[Person alloc]init]; 或者可以写成

id p = [[Person alloc]init];
//id 在这里可以简单看做是NSObject,这看起来是一个多态,,,值得注意的是:id 创建时  p  没有加 *

关于id的介绍可以参看博客:

Kikim的地盘—— Objective-C id类型实现原理区别

就先写到这里,有不妥当或不全的在改正补全。