黑马程序员技术交流社区
标题:
OC学习笔记03-OC中访问修饰符,点语法与@property,@synthesize关键字
[打印本页]
作者:
wowthe1st
时间:
2015-7-29 22:36
标题:
OC学习笔记03-OC中访问修饰符,点语法与@property,@synthesize关键字
适合有java基础的同学迅速了解OC,个人喜好用代码来记笔记,看起来直观形象;
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString * _name;//interface中无修饰默认protected
@protected
int _age,_height;
@private
double _weight;
@package
BOOL _isAlive;
}
@property NSString name;//生成getter和setter的声明
@property int age,height;//同种类型可以写一起,同样是分别生成
@property double weight;
@property BOOL isAlive;
@end
@implementation Person
- (void)setName:(NSString*)name
{
NSLog(@"set name");
_name=name;
}
//若setter,getter有部分实现,只生成未实现部分
@synthesize name = _name;
//也可以用,分隔写一行,生成时同样是一个一个生成getter和setter
@synthesize age=_age , height=_height , weight=_weight , isAlive=_isAlive;
@end
//子类继承父类所有成员及方法,虽然子类中无法直接访问父类private成员
//但子类仍然拥有该成员
@interface Staff : Person
{
@public
NSString * _nickname;
}
//Xcode4.4后,@property也包含了原本@synthesize的功能
//生成getter与setter的声明及实现,若无此成员变量,还默认生成private的以_开头的成员变量
@property double salary;
@property NSString *position;
@end
@implementation Staff
{
double _salary;//implementation中声明的默认为private
@public
int _staffNo;
}
//若无声明此成员,则自动生成
@synthesize position=_position;
@end
int main(int argc, const char * argv[])
{
Staff *staff=[Staff new];
[staff setName:@"Johnny"];
[staff setSalary:200.0];
[staff setIsAlive:YES];
//NSString 创建方式之一
NSString *str=[NSString stringWithFormat:@"my name is %@ and my salary is %.2f ",[staff name],[staff salary]];
NSLog(str);
// OC中的点语法,点语法本质是调用getter或setter,编译器碰到点语法,自动根据是否赋值转换成相应的getter或setter
staff.name=@"Bale";//等价于[staff setName:@"Bale"];
staff.position=@"manager";
NSString *str2=[NSString stringWithFormat:
@"my name is %@ and my salary is %.2f ",
staff.name,staff.salary]; //等价于[staff salary]
NSLog(str2);
}
/*
OC中的访问修饰符:
@public 公用的,都可直接访问
@protected 本类与其子类中可直接访问
@private 只能被本类中对象方法直接访问
@package 同一框架中可直接访问,非同一框架中无法直接访问
在interface中声明的成员变量默认是protected
在implementation中声明的成员变量,默认是private(在没被他人import的情况下,即使加@public仍然无法被他人引用)
关键字@property与@synthesize
@property 用于生成getter与setter的声明,只能用于interface中 例:@property NSString * name
@synthesize 用于生成getter与setter的实现,只能用于implementation中 例:@synthesize name = _name (若无_name的成员变量,则自动生成private 的_name成员变量)
生成的getter和setter会根据代码中的getter,setter实现情况和成员变量定义情况动态生成缺少的部分,即
若getter或setter已经有实现或声明则只生成没实现或没声明的那部分,若有自动生成getter或setter的实现而且
成员变量未定义,则自动生成private的_开头的成员变量
*/
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2