之前和同事讨论代码规范时提到代码中类成员的定义方式问题,发现这块的知识不是特别清晰,现在有时间整理一下,写给自己加强一下记忆。
先看代码:
// SampleClass.h
// storyBroadJump
//
// Created by wlq on 15/12/17.
// Copyright © 2015年 wlq. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface SampleClass : NSObject
{
NSString *_name;
NSString *_sex;
}
@property(nonatomic,retain)NSString *age;
@property(nonatomic,retain)NSString *sex;
- (void)test;
@end
//
// SampleClass.m
// storyBroadJump
//
// Created by wlq on 15/12/17.
// Copyright © 2015年 wlq. All rights reserved.
//
#import "SampleClass.h"
@implementation SampleClass
@synthesize sex = _sex;
- (void)test
{
self->_name = @"2";
_name = @"3";
// self.name = @"4";
_age = @"20";
self->_age = @"30";
self.age = @"30";
_sex = @"female";
self.sex = @"male";
self->_sex = @"female";
}
- (void)setAge:(NSString *)age
{
//ARC
_age = age;
//MRC
// if (_age != age) {
// [_age release];
// _age = [age retain];
// }
}
@end
在ObjC中推荐变量名以_开头。
头文件中定义了_name, _sex 和age 三个成员但是定义方式略有不同。_name只是包含在大括号中,_sex 是在大括号中定义并且@property @synthesize声明,而age仅仅在@property 声明。
在test 方法中用self.name 方式为name负值,编译器会报错,因为self.的方式的本质还是调用对应的方法,由于没有为_name声明
@property所以编译器报错。
声明 @property后编译器会为对应的成员生成getter 和setter 方法,当然程序员可以自己重现getter 和setter 方法以进行一些复杂处理。
sex 和age 在test方法中的使用完全一致而且_age 也可以使用,说明声明 @property 后相当于编译器添加了一个_age 到class中。
不同的程序员可能会习惯于不同的方式,这个影响不大,但是在项目中最好达成一致。