Objective c 如何创建一个只能在库中看到而不能在导出的头中看到的objective c方法
我正在构建一个用于控制iOS外部附件的静态库。作为这项工作的一部分,我想提供一组最小的公共头文件,这些文件将与编译后的库一起分发 我有一个类需要是公共的,但我想在它上面创建一些框架私有方法。我为其中一个公共类创建了一个类别来添加私有方法,包括一个初始值设定项。这对于项目测试很好,但会生成-[MyClass InitMethodDefinedCategory:]:发送到实例的无法识别的选择器错误 类别标题:Objective c 如何创建一个只能在库中看到而不能在导出的头中看到的objective c方法,objective-c,ios,objective-c-category,Objective C,Ios,Objective C Category,我正在构建一个用于控制iOS外部附件的静态库。作为这项工作的一部分,我想提供一组最小的公共头文件,这些文件将与编译后的库一起分发 我有一个类需要是公共的,但我想在它上面创建一些框架私有方法。我为其中一个公共类创建了一个类别来添加私有方法,包括一个初始值设定项。这对于项目测试很好,但会生成-[MyClass InitMethodDefinedCategory:]:发送到实例的无法识别的选择器错误 类别标题: #import "MyClass.h" @interface MyClass (Libr
#import "MyClass.h"
@interface MyClass (LibraryPrivateMethods)
- (id)initMethod:(NSData *)data;
- (int)someOtherMethod:(NSData *)data;
@end
使用类
#import "MyOtherClass.h"
#import "MyClass.h"
#import "MyClass+LibraryPrivateMethods.h"
@implementation MyOtherClass
#pragma mark - Instance Methods
- (id)initWithData:(NSData *)data
{
self = [super init];
if(self)
{
MyClass *mc = [[MyClass alloc] initMethod:data]; // errors here
_property = mc;
}
return self;
}
我已尝试添加中建议的-ObjC
链接器标志。我还尝试添加中建议的-all_load
标志
编辑:意识到我只是在XCode构建中添加,忘记检查构建脚本,如下所示
set -ex
INSTALL_PATH=$WORKSPACE/artifacts
[ -z $INSTALL_PATH ] || INSTALL_PATH=$PWD/artifacts
rm -rf $INSTALL_PATH
mkdir -p $INSTALL_PATH
PROJ=$SRCROOT/MyLib.xcodeproj
xcodebuild -project $PROJ -sdk iphoneos INSTALL_ROOT=$INSTALL_PATH/device install
xcodebuild -project $PROJ -sdk iphonesimulator INSTALL_ROOT=$INSTALL_PATH/simulator install
lipo -create -output $INSTALL_PATH/libMyLib.a $INSTALL_PATH/device/libMyLib.a $INSTALL_PATH/simulator/libMyLib.a
mv $INSTALL_PATH/device/Headers $INSTALL_PATH
rm -rf $INSTALL_PATH/device $INSTALL_PATH/simulator
# create zip for distribution.
(cd $INSTALL_PATH; zip -r ../MyLib-release.zip libMyLib.a Headers ../documentation/LibraryDocs/html ../documentation/LibraryDocs/docset)
将-ObjC标志添加到构建脚本的位置?
是否有任何理由不能在类别中使用初始值设定项方法?正如我所说,这似乎是可能的
Category方法可以执行类中定义的方法所执行的任何操作
适当的方法可以做到。在运行时,没有区别。方法
添加到类中的类别由所有类的
子类,就像其他方法一样
然后我尝试使用一个类扩展,但我不确定如何使该方法仅对框架类可见
@interface MyClass ()
- (id)initMethod;
@end
如果然后从库中的另一个类调用[[MyClass alloc]initMethod]
,则会出现“No visible@interface for MyClass声明选择器initMethod”错误
如何使对象上的方法只能由框架中的其他类访问,而不能在MyClass.h中导出?将类别声明放在单独的.h文件中。将这个私有的.h文件导入框架中需要访问category方法的.m文件中。不要将此.h文件打包到为客户端使用而分发的公共.h文件集中
BTW=不要使用类扩展名,使用命名的类别。将类别声明放在单独的.h文件中。将这个私有的.h文件导入框架中需要访问category方法的.m文件中。不要将此.h文件打包到为客户端使用而分发的公共.h文件集中
BTW=不要使用类扩展,使用命名的类别。请参阅以下内容底部的注释: 重要提示:对于64位和iPhone OS应用程序,存在一个链接器错误,它阻止-ObjC从只包含类别而不包含类的静态库加载对象文件。解决方法是使用-all_load或-force_load标志 由于
MyClass+LibraryPrivateMethods.m
仅包含类别代码,因此您似乎看到了注释中描述的错误
将您的私有实现移到主MyClass.m中,或尝试使用
-all\u load
或-force\u load
标志。请参阅以下内容底部的注释:
重要提示:对于64位和iPhone OS应用程序,存在一个链接器错误,它阻止-ObjC从只包含类别而不包含类的静态库加载对象文件。解决方法是使用-all_load或-force_load标志
由于MyClass+LibraryPrivateMethods.m
仅包含类别代码,因此您似乎看到了注释中描述的错误
将您的私有实现移到主MyClass.m中,或者尝试使用
-all\u load
或-force\u load
标志。无法在分配给该问题的时间内使其工作。最后,我删除了该类别,并将初始值设定项代码移动到MyOtherClass initWithData方法中。
这本书编得很好,很管用 无法在分配给该问题的时间内使其工作。最后,我删除了该类别,并将初始值设定项代码移动到MyOtherClass initWithData方法中。
这本书编得很好,很管用 这正是我所做的。我已经更新了我的问题,以更好地显示问题。这正是我所做的。我更新了我的问题以更好地显示问题。这很奇怪——我以前遇到过这个问题,添加
-ObjC
链接器标志解决了我的问题。在创建静态库和链接最终可执行文件时,是否尝试将-ObjC
标志传递给两个链接器命令行?您的initmethoddefinedCategory:
方法的实现在哪里?它与公共方法在同一个.m文件中,还是在一个单独的.m文件中?@Darren实现在MyClass+LibraryPrivateMethods.m文件中。因此,将一个单独的文件提交给公共方法。@AdamRosenfield您可能发现了什么。我忘记了构建脚本。将其添加到问题中。在构建脚本中,在哪里传入-ObjC标志?或者XCode会自动执行这类操作吗?@aj.esler:如果您使用xcodebuild
来构建静态库,那么您将不会在命令行上传递任何内容——您将在项目设置中的某个位置添加-ObjC
标志。如果没有明确的设置,那么应该在某个地方有一个“附加命令行选项”字段(或类似的内容)。这很奇怪——我以前遇到过这个问题,添加-ObjC
链接器标志解决了我的问题。在创建静态库和链接最终可执行文件时,是否尝试将-ObjC
标志传递给两个链接器命令行?您的initmethoddefinedCategory:
方法的实现在哪里?它与公共方法在同一个.m文件中,还是在一个单独的.m文件中?@Darren实现在MyClass+LibraryPrivateMethods.m文件中。因此,将一个单独的文件提交给公共方法。@AdamRosenfield您可能发现了什么。我忘了建造