may*_*uur 2 iphone optimization encapsulation objective-c
好的,所以我正在阅读一些关于良好编程实践的文章,并且我遇到了一个声明,说明为你的课程公开你的所有元素并不是一个好主意.也就是封装的概念.
现在在Objective C中,当我为我的类创建一个元素时,我会执行以下操作,考虑一个NSMutableArray
@property (nonatomic, retain) NSMutableArray* myArray;
Run Code Online (Sandbox Code Playgroud)
我为什么这样做?
因此,将Retain属性赋予myArray,从而使其更简单的内存管理周期.稍后,我将viewDidLoad中的myArray初始化为
self.myArray = [NSMutableArray arrayWithCapacity:0];
Run Code Online (Sandbox Code Playgroud)
后来在Dealloc ......
self.myArray = nil;
Run Code Online (Sandbox Code Playgroud)
什么是发生的
通过给出这个属性并在.m文件中合成myArray,我在不知不觉中做的是为我班级的所有元素制作Public Getters和Setters.
此外,来自Xib文件的自动生成的UI元素也具有相同的声明.
为类的每个元素继续创建公共Getter和setter不是一个好主意,对吧?
所以,绝对没有应用封装!如果我错了,请纠正我并帮助我解决任何问题!
谢谢!
只需使用Class Extensions原则,它允许您将部分声明放在.m文件中,从而使其在标题中不可见,而在其他类中不可见.
(顺便说一下,这是Apple推荐的声明私有方法和属性的方法)
YourClass.h
@interface MyClass : MySuperclass
// public properties
// public methods
@end
Run Code Online (Sandbox Code Playgroud)
YourClass.m
@interface MyClass()
// This is a class extension
// put here private properties
// and private methods too
@end
@implementation MyClass
// And your implementation of course here
@end
Run Code Online (Sandbox Code Playgroud)
您甚至可以在公共接口(在头文件中)将属性声明为只读,并在私有接口(在.m文件的类扩展中)中将其重新声明为readwrite,例如.
有关详细信息,请参阅Apple文档.
注意:
.h.在最新版本的编译器(Modern Objective-C)中,甚至不需要该@synthesize指令,因为它现在自动生成它(如果不存在)(参见doc).m执行相同.h.这也是一种从公共头中隐藏实例变量的方法.一般来说,我很少使用实例变量(因为只声明属性就足够了),如果我真的需要一个ivar,我在类扩展中声明它使它在公共头中不可见.| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |