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


点语法:点语法的本质还是方法调用

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文件一般不能被包含,所以它是私有的。

@interface和@implementation不能声明同名的变量


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


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

@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作用:帮助我们自动生成setter 和getter的实现

@implementation Person

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

@end


也可以多个声明

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

@end


多个实现

@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的声明与实现



你可能感兴趣的:(OC语言——点语法和成员变量的4种作用域及property和synthesize的使用)