Class Xcode 6-私有成员没有可见接口

Class Xcode 6-私有成员没有可见接口,class,nsmutablearray,switch-statement,let,Class,Nsmutablearray,Switch Statement,Let,我已经在cycles的实现文件中声明了私有变量 我的班级 @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 's

我已经在cycles的实现文件中声明了私有变量

我的班级

@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上的每个答案都和我一样。问题是什么?

问题是属性number是私有属性,因为您在.m文件的接口部分声明了它。改为在头myclass.h文件接口块中声明它。。private属性、ivar或方法只能通过使用self关键字从myClass对象的实例中访问(它基本上是指向当前正在其中执行的myClass实例的指针)

将属性声明移动到头文件将使属性可以从类实例外部访问。换句话说,它使它成为公共的


如果要限制对属性指向的数据的访问,请将头文件中的属性定义为只读属性:

MyClass.h

@interface MyClass : NSObject

    @property (nonatomic, readonly) unsigned int number;

@end
然后在.m文件中手动创建私有ivar,并覆盖number属性的getter,如下所示:

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

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

unsigned int number()
{
    return _number;
}

@end
这样子类(或其他任何子类)就不能处理number的值。然后,您可以访问主功能中的数字,如下所示:

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

您可以使用readonly/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内对其进行更改。您可以这样设置它的值,
self.number=5
在MyClass.m中


Objective-C不像Java这样的语言那样具有相同类型的私有变量。您试图用私有变量实现什么?

Hmm,但这样所有子类都可以访问该私有变量。我只希望myclass的实例具有访问权限。更新的答案。。。这就是你想要的吗?但我不想公开。我要保密。你能重写我的代码吗?这样我就可以看到你的建议了。我不明白。@vladimir您是在创建静态还是动态(.so)库?@vladimir-很抱歉,您必须公开一个公共属性或方法才能实现您的目标。例如,有没有标准的方法来访问私有成员而不在.h文件中声明它?我想隐藏私有变量以防继承。例子。类Employee具有accessCode。但是从类Employee派生的类Person不能访问accessCode。我希望你能理解我。我认为你有这种倒退,员工应该是人的一个子类。。。因为员工首先是个人,然后是员工。创建一个
Person
类,然后创建一个
Employee
Person
将无法访问员工的任何属性。是的,我知道,但如果必须是这样怎么办。我学习ObjultC。我是C++程序员,在C++中隐藏继承很容易,但是我想知道如何用Objto-C来做它而不使用覆盖方法,也不需要找到其他的方法。我希望有一种简单的方法可以做到这一点。您需要在.h文件中公开属性,以便在实现文件之外访问它。访问实现文件中声明的属性的另一种方法是在类的头文件中创建实例方法。