Iphone 目的C包封

Iphone 目的C包封,iphone,objective-c,ipad,Iphone,Objective C,Ipad,我将用一个例子来解释我的问题 在.H文件中// @interface Employee:NSObject{ @private NSString *name; } @property(nonatomic,retain) NSString *name; 在.M文件中// @implementation{ @synthesize name; } 在这个场景中,当我在另一个类中访问name属性时,比如myEmp.name=@“John” 这不会引起任何问题。这是根据封装规则还是我误解了?

我将用一个例子来解释我的问题

在.H文件中//

@interface Employee:NSObject{

@private

NSString *name;

}

@property(nonatomic,retain) NSString *name;
在.M文件中//

@implementation{

@synthesize name;

}
在这个场景中,当我在另一个类中访问name属性时,比如
myEmp.name=@“John”

这不会引起任何问题。这是根据封装规则还是我误解了?

您没有违反封装规则,因为
@属性(非原子,保留)NSString*名称
已指示您要公开
name
的getter/setter

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

myEmp->name = @"John";  // wrong

我想你误解了@property和@synthesis的用途。它们是定义访问器方法的方便方法。也就是说,你所拥有的相当于:-

- (NSString *)name;
- (void)setName:(NSString *)value;
myEmp.name=@“John”
[myEmp setName:@“John”]


因此,您显式创建了可选的公共访问器方法,然后使用它们。在Objective-C中,只有object的实例方法可以访问实例变量。外部对象无法直接访问对象的实例变量。
@private
仅与继承相关


要使变量可访问,有一些属性。属性定义方法,Objective-C上的方法都是公共的。Objective-C中没有定义私有方法的方法,您只能通过在public.h文件之外的其他地方声明它们来“隐藏”它们(例如,通过声明匿名部分的
@interface Employee()
在.m文件中)。

直接从外部对象访问IVAR非常容易,不管是否有
@private
@bbum:你是对的,我假设Objective-C在这里的行为与Ruby相同……谢谢。我不知道。:-)嗨,你对iOS中的封装有确切的想法吗?在您的示例中,我们可以说这是iOS封装的示例吗?如果类中没有数据的属性,那么使用object->ivarName将是在isEqualTo方法中访问IVAR的唯一方法。