HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – NSObject的类别可用于每个NSObject子类,即使没有任何地方导入此类别的.h文件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
背景.

虑以下步骤:

1)在Xcode中创建一个新的“单一视图应用程序”.

2)创建一个类NSObject Extension.h和.m文件

// .h
@interface NSObject (Extension)
- (void)someMethod;
@end

// .m
@implementation NSObject (Extension)
- (void)someMethod {
    NSLog(@"someMethod was called");
}
@end

3)确保NSObject Extension.m文件包含在主目标中.

4)将以下行添加到AppDelegate中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[NSString new] performSELEctor:@SELEctor(someMethod)];

    return YES;
}

5)确保#import“NSObject Extension.h行在应用程序中不存在!

6)运行应用程序.

输出

2013-08-27 04:12:53.642 Experimental[32263:c07] someMethod was called

问题

>我想知道在应用程序中是否有任何这个类别的任何#import,NSString甚至还有NSObject Extension可用吗?这个行为让我对每个我声明的Objective-C类感到非常糟糕,因为我希望我声明的类别只能在它们被声明的范围内可用.例如,我希望NSObject只在一些类中扩展,而不是在整个应用程序中,因为它的全局空间变得“被污染”.
有没有办法避免这种行为?我确实希望我的类别只有在我明确导入它们时才能工作,而不是当我将它们链接到我用来运行的目标时.

解决方法

Objective-C对象上没有命名空间.如果您声明一个类有一个方法(无论是通过类别还是在主@interface中),那么该类的每个实例都将具有该方法.

Objective-C处理“私有”方法方法是通过选择不向别人告知有关方法(这是通过不导入声明这些方法文件来实现的).这个,加上-Wundeclared-SELEctor(如果你使用编译器不知道的选择器,那么警告)就像你要得到的一样好.

但是,无论如何将.m文件编译到最终的二进制文件中,即使没有其他人“知道”,该方法也会存在.

是的,使用-Wundeclared选择器,Xcode会警告你.

大佬总结

以上是大佬教程为你收集整理的ios – NSObject的类别可用于每个NSObject子类,即使没有任何地方导入此类别的.h文件全部内容,希望文章能够帮你解决ios – NSObject的类别可用于每个NSObject子类,即使没有任何地方导入此类别的.h文件所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。