objective-c中的属性定义及getter / setter方法

一、 属性定义:

与其它语言的成员变量定义并无差别: 变量类型 变量名;提倡规范是变量名以下划线做前缀,如 NSString* _name;

以下以name为例;

二、点方法(getter/settter)的定义和调用

教程上说,在oc中,点调用只能在setter和getter方法中使用,编译器会根据点调用的方法位于等号的左侧还是右侧来判断是get还是set。

1. setter方法

*.h文件声明  : - (void)setAbc:(变量类型)参数;如 - (void)setName:(NSString*)name;

*.m文件实现:    - (void)setName:(NSString*)name;

调用: obj.name = @"zhangsan";  //相当于 [obj setName:@"zhangsan"];

这调用一看就觉得很奇怪,我们平时所熟悉的C++中的调用方法名都是在类的定义中有声明的,方法名要严格一致,而这里的"name"不与"setName“相同也不与变量名”_name“相同,那么,应该是有一种这样的对应关系: ".name" --> "setName",那大小写关系是什么转换关系呢?带着好奇做了如下尝试:

    /*方法定义形式:setAa*/
        person.aa = 0;
        person.Aa = 0;
    //  person.aA = 0;  //编译不过
    //  person.AA = 0;  //编译不过
        
         /*方法定义形式:setBB*/
    //  person.bb = 1;  //编译不过
    //  person.Bb = 1;
        person.bB = 1;
        person.BB = 1;
        
        /*方法定义形式:setcc */
    //  person.cc = 2;  //编译不过
    //  person.Cc = 2;  //编译不过
    //  person.cC = 2;  //编译不过
    //  person.CC = 2;  //编译不过
        
        /*方法定义形式:setdD*/
    //  person.dd = 3;  //编译不过
    //  person.Dd = 3;  //编译不过
    //  person.dD = 3;  //编译不过
    //  person.DD = 3;
    
    //  setEe:(float)ee; 成员变量也是ee
        person.ee = 4;  //build succeed
        NSLog(@"person.ee = %f", person.ee);//打印出person.ee = 0.00000,显然set方法没成功执行
        //上述表明:set方法的参数与成员名字如果完全一致,直接赋值是不成功的
        
    //方法定义 :set_ff
        person._ff = 3;
    //  person._Ff = 3;  //编译不过
        //综上,set方法的定义set后的第一个字母必须大写,而调用的时候第一个字母随意,其他字母严格按set方法一致
        //但如果set后第一个字符为非字母,则完全保持set后的几个字符一致;方法的参数名不能与属性名一样

2. getter方法

*.h文件声明: - (变量类型)abc;  如 - (NSString*)name;

*.m文件实现 : 

 -(NSString*)name {

return _name;

}

这里,相比set又不一样了,没有get前缀,也不需要首字母大写;这里还是做了一样的尝试:

//getter方法调用
        float f;
        //- (float)Aa;    //规范定义
        f = person.aa;
//        f = person.Aa;    //编译不过
//        f = person.AA;    //编译不过
//        f = person.aA;    //编译不过
        
        // - (float)Bb;
   //     f = person.bb;      //property 'bb' not found
        f = person.Bb;
   //     f = person.BB;      //no getter method for read from property
   //     f = person.bB;      //No getter method for read from property
        
        // - (float)CC;
//        f = person.cc;      //property not found...
//        f = person.Cc;      //property not found...
        f = person.CC;
//        f = person.cC;      //property not found...
        
        // - (float)dD;
//        f = person.dd;      //property not found...
//        f = person.Dd;      //property not found...
//        f = person.DD;      //property not found...
        f = person.dD;
        
        // - (float)ee;
        f = person.ee;
//        f = person.Ee;      //property not found...
//        f = person.EE;      //property not found...
//        f = person.eE;      //property not found...
        
        person._ff = 3;
        //综上,getter方法在调用的时候必须与定义一致,不要求get方法首字母大写
这样,oc的setter方法和getter方法自认为算是比较清楚了,希望没有理解错误。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值