Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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
Objective c 如何创建一个只能在库中看到而不能在导出的头中看到的objective c方法_Objective C_Ios_Objective C Category - Fatal编程技术网

Objective c 如何创建一个只能在库中看到而不能在导出的头中看到的objective c方法

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

我正在构建一个用于控制iOS外部附件的静态库。作为这项工作的一部分,我想提供一组最小的公共头文件,这些文件将与编译后的库一起分发

我有一个类需要是公共的,但我想在它上面创建一些框架私有方法。我为其中一个公共类创建了一个类别来添加私有方法,包括一个初始值设定项。这对于项目测试很好,但会生成-[MyClass InitMethodDefinedCategory:]:发送到实例的无法识别的选择器错误

类别标题:

#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您可能发现了什么。我忘了建造