Objective c 目标C:非导入类是否编译并链接到最终二进制文件中?

Objective c 目标C:非导入类是否编译并链接到最终二进制文件中?,objective-c,llvm,Objective C,Llvm,在Objective-C中,项目中的所有源文件是否都被编译并链接到最终二进制文件中,即使它们没有被任何类导入?这取决于您的目标设置。如果进入目标的构建阶段,则编译源代码下列出的任何内容都将被编译 这取决于您的目标设置。如果进入目标的构建阶段,则编译源代码下列出的任何内容都将被编译 如果源文件是构建的一部分,那么它的类将以二进制形式结束,并在运行时可用。这是因为运行时是反射的,可以稍后查询以找到它们。编译器无法确定这不会发生 编辑:一个典型的用例是一个非正式的协议。您可以编写如下代码: - (vo

在Objective-C中,项目中的所有源文件是否都被编译并链接到最终二进制文件中,即使它们没有被任何类导入?

这取决于您的目标设置。如果进入目标的构建阶段,则编译源代码下列出的任何内容都将被编译

这取决于您的目标设置。如果进入目标的构建阶段,则编译源代码下列出的任何内容都将被编译

如果源文件是构建的一部分,那么它的类将以二进制形式结束,并在运行时可用。这是因为运行时是反射的,可以稍后查询以找到它们。编译器无法确定这不会发生

编辑:一个典型的用例是一个非正式的协议。您可以编写如下代码:

- (void)initWithObject:(id)object
{
     self = [super init];

     if(self)
     {
          _title = [object title];
          _value = [object value];
     }

     return self;
}
然后,您可能决定将该非正式协议的实现添加到,例如,
NSString

@interface NSString (MYPropertyProtocol)
@end

@implementation NSString (MYPropertyProtocol)

- (NSString *)title
{
     return @"Content";
}

- (NSString *)value
{
     return self;
}

@end
没有人导入
NSString
类别并不意味着没有使用这些方法

除此之外,在我当前的应用程序中,我们有一个协议,如(这是一个大幅缩减的版本):

随后,
UITableView
子类可以选择实现
MYTableViewCell
。如果是这样,它们将通过遍历
objc_getClassList
(以及大量缓存)自动找到,并由我的表视图数据源自动使用,如果它想显示
acceptedObjectClasses
声明为支持的任何对象类型。因此,这就省去了编写表视图数据源的大部分麻烦-我只有一个,它可以接受应用程序中任何位置使用的对象的任何组合,但是它非常短,在精神上很容易检查错误,而且即使应用程序了解到更多需要在表中显示的内容,它也不需要增长


没有人会显式导入这些表视图单元格,因为这意味着必须做两次相同的工作-在Objective-C中声明类,编译器将为我检查,然后将其重新声明到我实现的自定义精简查找系统中,而不只是使用Objective-C,我可能需要对其进行手动验证。

如果源文件是构建的一部分,那么它的类将以二进制形式结束,并在运行时可用。这是因为运行时是反射的,可以稍后查询以找到它们。编译器无法确定这不会发生

编辑:一个典型的用例是一个非正式的协议。您可以编写如下代码:

- (void)initWithObject:(id)object
{
     self = [super init];

     if(self)
     {
          _title = [object title];
          _value = [object value];
     }

     return self;
}
然后,您可能决定将该非正式协议的实现添加到,例如,
NSString

@interface NSString (MYPropertyProtocol)
@end

@implementation NSString (MYPropertyProtocol)

- (NSString *)title
{
     return @"Content";
}

- (NSString *)value
{
     return self;
}

@end
没有人导入
NSString
类别并不意味着没有使用这些方法

除此之外,在我当前的应用程序中,我们有一个协议,如(这是一个大幅缩减的版本):

随后,
UITableView
子类可以选择实现
MYTableViewCell
。如果是这样,它们将通过遍历
objc_getClassList
(以及大量缓存)自动找到,并由我的表视图数据源自动使用,如果它想显示
acceptedObjectClasses
声明为支持的任何对象类型。因此,这就省去了编写表视图数据源的大部分麻烦-我只有一个,它可以接受应用程序中任何位置使用的对象的任何组合,但是它非常短,在精神上很容易检查错误,而且即使应用程序了解到更多需要在表中显示的内容,它也不需要增长


没有人会显式导入这些表视图单元格,因为这意味着必须做两次相同的工作-在Objective-C中声明类,编译器将为我检查,然后将其重新声明到我实现的自定义精简查找系统中,而不只是使用Objective-C,我可能需要对其进行手动验证。

单击Xcode左侧项目导航器中的.m文件,然后打开右侧的互动程序(使用工具栏中的右侧“查看”按钮)并查看“目标成员资格”部分。旁边有一个带有项目名称的复选框。如果选中该框,则该.m文件将包含在生成中。如果未选中该复选框,则基本上忽略.m


您还可以通过单击ProjectNavigator列顶部的项目名称,在“目标”下选择项目,选择“构建阶段”,然后选择“编译源代码”来检查这一点。将显示所有包含的.m文件,您可以使用列表底部的
+-
按钮从列表中添加或删除文件。

单击Xcode左侧项目导航器中的.m文件,然后打开右侧互动程序(使用工具栏中的右侧“查看”按钮)并查看“目标成员资格”部分旁边有一个带有项目名称的复选框。如果选中该框,则该.m文件将包含在生成中。如果未选中该复选框,则基本上忽略.m


您还可以通过单击ProjectNavigator列顶部的项目名称,在“目标”下选择项目,选择“构建阶段”,然后选择“编译源代码”来检查这一点。所有包含的.m文件都将显示出来,您可以使用列表底部的
+-
按钮从列表中添加或删除文件。

三个答案说它会在那里,我说不会。可能我错了,但请向memartin解释。r确实向我解释过。阶级确实仍然存在。符号可能会被剥离。。。有三个答案说它会在那里,我说不会。可能我错了,但请向我解释。我确实向我解释过。阶级确实仍然存在。符号可能会被剥离。。。doh