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类型实现原理区别
就先写到这里,有不妥当或不全的在改正补全。