一、 属性定义:
与其它语言的成员变量定义并无差别: 变量类型 变量名;提倡规范是变量名以下划线做前缀,如 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方法首字母大写