您的位置:首页 > 编程语言 > C语言/C++

OC语言——点语法和成员变量的4种作用域及property和synthesize的使用

2015-04-01 21:25 323 查看
点语法:点语法的本质还是方法调用

Person *p = [Person new];

// 点语法的本质还是方法调用
p.age = 10; // [p setAge:10]
一.点语法注意点:

@implementation Person
//setter方法中的死循环
-(void)setAge:(int)age
{
// 会引发死循环,不停的调用setter方法[self setAge:age]
self.age = age;
}

- (int)age
{
// 下面也会引发死循环,调用getter方法[self age]
return self.age; // 应该这样输出:return _age; 或者 return self->_age;
}


在使用点语法中,可以使用断点进行测试,确保输出无误。

二.成员变量的四种作用域

1.@public // 在任何地方都可以访问成员变量

@interface Person : NSObject
{
@public
int _age;
int _height;
}


2.@private // 只能在当前类的对象方法中直接使用(私有)

@interface Person : NSObject
{
 @private
int _age;// 默认就是私有

}


3.@protected // 能在当前类和子类的对象中访问,默认情况在.h文件下什么都不写就是@protected

@interface Person : NSObject
{   //什么都不写,默认就是@protected
int _age;
int _height;
}


4.@package // 同一个体系“框架”可以访问,介于@private和@public之间,一般很少用到,暂不描述

成员变量的注意点:

默认情况下在声明(@interface)中的变量默认是@protected,在实现(@implementation)中默认是@private

原因是:.m文件一般不能被包含,所以它是私有的。

[b]@interface和[b]@implementation不能声明同名的变量[/b]
[/b]

三. 两个关键字@property和@synthesize 

[b]@property作用:帮助我们自动生成setter 和getter的声明[/b]

@interface Person : NSObject</span></span>
@property int age; // 自动生成setter声明,和getter声明</span></span>
// -(void)setAge:(int)age;
// -(int)age;
</pre><pre name="code" class="objc">@end

 @synthesize作用:[b]帮助我们自动生成setter 和getter的实现[/b]



@implementation Person

//会自动生成age的setter和getter实现,并且会访问_age这个成员变量
@synthesize age = _age;

@end


[b][/b]

也可以多个声明

@interface Person : NSObject</span>
//生成age和weight属性的声明
@property age = _age, weight = _weight;

@end


[b][/b]

多个实现



@implementation Person

//生成age和weight属性的实现


@synthesize age = _age, weight = _weight;
@end



注:在没有写成员变量的情况下,@synthesize会自动生成所需要成员变量。

例如:



@implementation Person

//会访问_age这个成员变量,如果不存在,就会自动生成@private类型的_age变量
@synthesize age = _age;

@end


注:如果在实现中@implementation

@synthesize age; // 它会访问跟名字一模一样的age

在最新的xcode中,已经不需要写@synthesize,@property已经独揽所有的任务,可以自动生成setter和getter的声明与实现

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: