#import
@interface
}
@property(nonatomic,retain)
@end
在*.m中
#import
@implementation
@synthesize test=_test;
- (void)viewDidLoad
{
}
@end
首先,_下划线是一种编程规范,apple的代码开始没有这么做,最近两年才这样了,用于修饰成员变量,@synthesize name=_name; 目的就是生成的getter和setter中所引用的是_name 而不是name。name从此就不应该在代码中出现,该出现的要么是_name,要么self.name.
self.name 就是[self getName]
http://self.xxx访问的是xxx的getter。
这两者并不是完全等价的,http://self.xxx是用objc_msgSend发消息,_xxx或者self->xxx则是直接访问内存地址,
一般建议在init里面用_xxx,其他地方用http://self.xxx
第一种是比较老式的写法,不过 NSString *_test; 这个就是多余的了,这个是更老式的了,那时候要手写 getter setter
因为有了 synthesize 自动属性合成器以后,这步,Xcode已经帮你做过了。
还帮你写了默认的 getter setter 方法,有下划线就是标识,这个是成元变量,以便于区分 getter setter 中的形参(局部变量)。
在 m 文件中是可以直接对 带下划线的 成员变量进行赋值等操作的,但规范还是建议 使用 self.test 这样来操作,除非你正在 setter getter 方法中,那是不能用这个。
还有谷歌那个 objc 代码风格,, 哈哈成员变量 下划线在后面, test_ ,又晕了吧?我估计这个风格是为了完全区分 纯成员变量,和 属性。就是说 后面带下划线的这货,就纯粹是类本身自己用,没有 getter setter,不需要给别的类访问。
最后,早在 Xcode 4.6 起,还是更早来着,记不得了, 什么 synthesize 根本不用写的,Xcode 已经帮你写了 @synthesize test = _test。
所以现在最简洁的思路就是,如果你这个变量,是要给其他类能够访问到的,那么你就直接写个 @property 就够了。
声明成员变量 NSString *_test; 还有属性合成器 @synthesize test = _test,不需要写了,
如果你这个变量,完全不需要给类外部访问,那么你就 自己声明个 成员变量 NSString *test_; 其他别写。该初始化的地方初始化该释放的释放
//----------------
发现被踩了下,纯个人理解可能会有误,如有误望不吝请指出,多谢,
前面最后说的有些不严谨了~ 没说 在 h 和 m 中的区别。
在 h 中,只有 成员变量的话虽然没有 getter setter , 子类还是能访问的。属性的话就是相当于公开的。
在 m 中,都是私有了。