2015-01-21 69 views
0

我宣布在循环的实现文件的私有变量没有明显的接口。的Xcode 6 - 私人会员

myclass.m

@interface myclass() 

@property (nonatomic) unsigned int number; 

@end 

好吧,当我把在main.m文件是这样的:

myclass * some = [[myclass alloc] init]; 

[some setNumber:10]; // no visible @interface for 'myclass' declares the selector 'setNumber'. 

unsigned int a=[some getNumber]; //no visible @interface ... 

上StackOverflow.com每一个答案点作为我这样做。问题是什么?

回答

0

问题是,属性number是一个私有属性,因为您在.m文件的接口部分中声明了它。声明它在头myclass.h文件接口块代替..甲私人财产,实例变量或方法是一个只能从myClass的对象的一个​​实例中,通过使用自关键字(这基本上是一个指针访问到您当前正在执行的myClass实例)。

移动你的财产申报的头文件将会使财产从类实例外部访问。换句话说,它使公开


如果要限制对数据的访问属性点,定义在头文件属性为只读属性:在

MyClass.h

@interface MyClass : NSObject 

    @property (nonatomic, readonly) unsigned int number; 

@end 

然后你.m文件手动创建私人伊娃,并覆盖数字属性的获取方式如下:

MyClass.m

@implementation MyClass { 
    //Instance variable (ivar) 
    unsigned int _number; 
} 

unsigned int number() 
{ 
    return _number; 
} 

@end 

这样一个子类(或任何其他为此事)不能与数字的值淤泥。然后,您可以按如下方式访问主功能中的号码:

MyClass* myClass = [[MyClass alloc] init]; 
unsigned int newNumber = myClass.number; //There is no such selector called getNumber BTW, only number. 
+0

嗯,但这样所有的子类将有权访问该私有变量。我只希望myclass的实例有权访问。 – vladimir 2015-01-21 01:12:06

+0

最后回答...这有点你在找什么? – Ron 2015-01-21 01:32:01

+0

但我不希望它是**公共**。我希望它是**私人**。你能否重写我的代码,以便我能看到你的建议。我不明白。 – vladimir 2015-01-21 01:38:38

0

您可以使用只读/ readwrite属性定义来实现此目的。

在MyClass.h

@interface MyClass : NSObject 

@property (nonatomic, readonly) NSNumber *number; 

@end 

在MyClass.m

@interface MyClass() 

@property (nonatomic, readwrite) NSNumber *number; 

@end 

现在,您可以阅读number属性的类之外,你只能改变它在MyClass.m里面。你可以在MyClass.m里设置它的值,如self.number = 5

Objective-C没有像Java这样的语言具有的相同类型的专用变量。你想用私有变量来完成什么?

+0

是否有标准的方式来访问私有成员,而无需在.h文件中声明它? – vladimir 2015-01-21 02:02:54

+0

我想隐藏继承的私有变量。例。类员工具有accessCode。但是派生于类Employee的类Person可以访问accessCode。我希望你能理解我。 – vladimir 2015-01-21 02:06:51

+0

我认为你有这个倒退,员工应该是Person的一个子类......因为员工首先是一个人,然后是一个员工。创建一个Person类,然后创建一个Employee类。 'Person'将无法访问任何'Employee'的属性。 – timgcarlson 2015-01-21 02:24:18