Objective C封装

Cha*_*sha 2 iphone objective-c ipad

我将从一个例子中解释我的问题.

在.H文件中//

@interface Employee:NSObject{

@private

NSString *name;

}

@property(nonatomic,retain) NSString *name;
Run Code Online (Sandbox Code Playgroud)

在.M文件中//

@implementation{

@synthesize name;

}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当我访问另一个类中的name属性时,myEmp.Name = @"John"; 它不会引起任何问题.这是根据封装规则还是我的误解?

ken*_*ytm 7

您没有破坏封装规则,因为@property(nonatomic,retain) NSString *name;已经表明您要公开getter/setter name.

只有当您直接访问ivar时才会破坏封装,即

myEmp->name = @"John";  // wrong
Run Code Online (Sandbox Code Playgroud)


hoo*_*oop 5

我认为你误解了@property和@synthesize的用途.它们是定义访问器方法的便捷方式.即.你拥有的相当于: -

- (NSString *)name;
- (void)setName:(NSString *)value;
Run Code Online (Sandbox Code Playgroud)

myEmp.name = @"John" 是语法糖 [myEmp setName:@"John"]

因此,您明确创建了可选的公共访问器方法,然后使用它们.这里没有破坏封装.