Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何使它成为类的私有成员或方法,以便可以在静态库内部而不是在库外部访问它?_Iphone_Objective C_Ios_Static Libraries - Fatal编程技术网

Iphone 如何使它成为类的私有成员或方法,以便可以在静态库内部而不是在库外部访问它?

Iphone 如何使它成为类的私有成员或方法,以便可以在静态库内部而不是在库外部访问它?,iphone,objective-c,ios,static-libraries,Iphone,Objective C,Ios,Static Libraries,我想为objective-c中的以下课程准备一个小型静态库: 类A,类B,类C。我想在静态库中包含这些类。现在,类A可以访问类B或类C的方法的公共成员 现在,当我将上述库集成到其他项目中时, 我准备的D班只能进入A班和B班 不是C班,我怎么做 我的另一个怀疑是假设 NSString*isValid在类B中声明 我希望上面的变量可以从类A和类C访问 我的意思是库中包含的文件可以访问上述变量 但从库外部无法访问上述变量。 如何将其私有化,使其可以在库内而不是在库外访问 谢谢你的帮助 据我所知,Obj

我想为objective-c中的以下课程准备一个小型静态库: 类A,类B,类C。我想在静态库中包含这些类。现在,类A可以访问类B或类C的方法的公共成员

现在,当我将上述库集成到其他项目中时, 我准备的D班只能进入A班和B班 不是C班,我怎么做

我的另一个怀疑是假设 NSString*isValid在类B中声明

我希望上面的变量可以从类A和类C访问 我的意思是库中包含的文件可以访问上述变量

但从库外部无法访问上述变量。 如何将其私有化,使其可以在库内而不是在库外访问


谢谢你的帮助

据我所知,Obj-C中没有办法保护公众成员的访问权,就像你需要的那样。一种常见的方法是不在静态库附带的头文件中包含方法和IVAR。为了自己编译库,当然必须使用完整的私有头


请注意,这不适用于Objective-C++,因为在编译时库的客户端必须知道类结构

您可以使公共方法仅对静态库可见,但在其外部不可见

下面是如何做到这一点

1) 创建要在库外部使用的头文件

#import <Foundation/Foundation.h>

@interface ClassA : NSObject 

@property(nonatomic,readwrite)BOOL publicProperty;

-(void)publicMethod;

@end
注意将此文件命名为:“ClassA+Internal.h”

3) 在.m文件中再次声明您的私有属性和方法

#import "ClassA.h"

@interface ClassA ()

@property(nonatomic,readwrite)BOOL privateProperty;

-(void)privateMethod;

@end

@implementation ClassA

@synthesize publicProperty;
@synthesize privateProperty;

//...

@end
在静态库中使用私有属性和方法

在ClassB.m文件中,导入ClassA类别的头文件

#import "ClassB.h"
#import "ClassA.h"
#import "ClassA+Internal.h"
现在您可以访问ClassA的私有属性和方法

创建没有私有属性和方法的静态库

创建静态库时,将“ClassA+Internal.h”类别头文件保存在“构建阶段”、“复制头”的“私有”或“项目”头部分中


这样,当您构建静态库时,外部将无法访问ClassA+Internal.h类别。

当您的答案几乎是相同的解决方案(尽管解释得更好)时,我关于“您需要使用库的两个标题,一个公共标题和一个私有标题”的回答怎么会错误到足以导致否决票?私有标题是声明类别还是重新声明完整标题与问题无关。@Cyprian:为什么必须在classA.m中重新声明匿名类别中的属性和函数?
#import "ClassB.h"
#import "ClassA.h"
#import "ClassA+Internal.h"