Objective-C之点语法和属性

本文详细介绍了Objective-C中的点语法及其本质,强调点语法是对set和get方法的调用。同时,文章讨论了属性(property)的使用,包括在Xcode4.4之前的旧版语法和之后的增强版特性。点出了@property关键字如何自动生成get和set方法,以及@synthesize的作用和规则。文章还涵盖了手动实现属性时的编译器行为,并提及了属性在继承中的私有性。
摘要由CSDN通过智能技术生成

一.点语法

       点语法的本质是对 set 和get方法的调用.

Student *stu = [[Student alloc] init];
stu.ID = 10;//set方法

        注意:

        1.stu.ID = 10,不是给Student成员变量ID “直接赋值”,而是调用Student中的setID方法,“间接”给成员变量赋值,并且传递10,所以   stu.ID = 10   等于    [stu setID :10];

         2.也可以调用get方法,可以点语法写为 stu.id , 相当于 【stu ID】;    

         3.在其他文件中访问该类的成员变量只有一种方式即使用"->" 如stu->ID,这种情况要求在@public修饰的前提下。

            在本类中可以  "_ID"  或 stu -> "ID";

 

          死循环的两种方式:

        4.在set方法中,self.age=age;相当于是[self setAge:age];
 

        5.在get方法中,return self.age;相当于是[self age];

 

        6.如果属性没有封装setter getter 是无法使用点语法的。

 

    例子:

    

    

    

 

二.属性:

        @property @synthesize关键字

在 OC 中经常使用 get 和 set 方法,但是当成员变量太多的时候,就要敲很多行 get 和 set 方法。在 xcode4.4 之前,为了简洁代码。

1.可以使用@property 自动生成某个“成员变量” get 和 set 方法 声明

//当编译,遇到这行时
@property int age;
//自动生成set/get方法
-(void)setAge:(int)age;
-(int)age

 

2.可以使用@synthesize 帮助生成“成员变量”的get 和 set方法 实现  ,并且会访问_age这个成员变量。

 

@synthesuze age = _age;
//自动生成
-(void)setAge:(int)age{
_age = age;
}
-(int)age{
return _age;
}

注意点:

 

@synthesize age = _age;

  • setter 和 getter 实现中会访问成员变量 _age
  • 如果成员变量 _age 不存在,就会自动生成一个 @private 的成员变量 _age

@synthesize age;

  • setter 和 getter 实现中会访问成员变量 age
  • 如果成员变量 age 不存在,就会自动生成一个 @private 的成员变量 age
  • 如果类中同时存在成员变量 age 和_age,则默认情况下会访问与 age 名字一样 的成员变量,即访问 age 而不是_age。

 

例子:

@property只能写在@interface  @end中,@synthesize只能写在@implementation   @end中

以上的写法,在Xcode4.4以前。

 

 

Xcode4.4以后,property增强版。

 

最新版的功能:

 

@property int age;这句话完成了3个功能:

(1)生成_age成员变量的get和set方法的声明;

(2)生成_age成员变量set和get方法的实现;

 (3)生成一个_age的成员变量。


注意:这种方式生成的成员变量是private的。


    也可以通过在{}中加上int _age;显示的声明_age为protected的。


原则:get和set方法同变量一样,如果你自己定义了,那么就使用你已经定义的,如果没有定义,那么就自动生成一个。

 

 

 

手动实现:


(1)如果手动实现了set方法,那么编译器就只生成get方法和成员变量;


(2)如果手动实现了get方法,那么编译器就只生成set方法和成员变量;

 

 

 

 

 

 

(3)如果set和get方法都是手动实现的,那么编译器将不会生成成员变量。

 

 

 

@interface YourClass : NSObject{

  //方法1
  NSMutableArray *_mas;
}
@property (nonatomic,strong) NSMutableArray *mas;
@end

@implementation YourClass
//方法2
@synthesize yourProperty = _yourProperty;

-(void)setMas:(NSMutableArray *)mas{
    
}
-(NSMutableArray *)mas{
    if (!_mas) {
        _mas = [NSMutableArray array];
    }
    return _mas;
}
@end

 

注意:父类的property一样可以被子类继承,但是生成的属性是私有的,可以通过setter getter方法来访问

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值