我们可以在Obj C元素上保留没有getter和setter的属性吗?

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不是一个好主意,对吧?

所以,绝对没有应用封装!如果我错了,请纠正我并帮助我解决任何问题!

谢谢!

Ali*_*are 5

只需使用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,我在类扩展中声明它使它在公共头中不可见.