使用NSClassFromString

使用NSClassFromString

使用NSClassFromString可以直接从字符串初始化出对象出来,即使不引用头文件也没关系,以下是源码:

AppDelegate.m

//
//  AppDelegate.m
//  Class
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "AppDelegate.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    Class aClass                   = NSClassFromString(@"RootViewController");
    UIViewController *CV           = [[aClass alloc] init];
    self.window.rootViewController = CV;

    self.window.backgroundColor    = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

@end

RootViewController.m

//
//  RootViewController.m
//  Class
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"

@interface RootViewController ()

@end

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor redColor];
}

@end

改进点的方式(直接改装成为category):

NSString+CreateClass.h 与 NSString+CreateClass.m

//
//  NSString+CreateClass.h
//  Class
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSString (CreateClass)

- (Class)toClass;

@end
//
//  NSString+CreateClass.m
//  Class
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "NSString+CreateClass.h"

@implementation NSString (CreateClass)

- (Class)toClass
{
    return NSClassFromString(self);
}

@end

 

-备注-

这种用法是有着缺陷的呢:

这是在运行时的时候检测出来的,很不保险的说.

 

时间: 2024-10-02 14:58:29

使用NSClassFromString的相关文章

使用FastCoder写缓存单例

使用FastCoder写缓存单例 FastCoder可以存储字典,数组,鄙人将FastCoder封装,CoreData可以缓存的东西,用这个都可以缓存,但是只适合缓存少量的数据(不适合存储几万条数据). 基于文件的类请参考上一章节内容 使用详情: 源码: 使用的缓存文件 SharedFile.h 与 SharedFile.m // // SharedFile.h // Array // // Created by YouXianMing on 14/12/1. // Copyright (c)

Xcode的gdb调试

关于GDB 对于大多数Cocoa程序员来说,最常用的debugger莫过于Xcode自带的调试工具了.而实际上,它正是gdb的一个图形化包装.相对于gdb,图形化带来了很多便利,但同时也缺少了一些重要功能.而且在某些情况下,gdb反而更加方便.因此,学习gdb,了解一下幕后的实质,也是有必要的. gdb可以通过终端运行,也可以在Xcode的控制台调用命令.本文将通过终端讲述一些gdb的基本命令和技巧. 首先,我们来看一个例子:     #import <Foundation/Foundation

iOS 利用 framework 进行动态更新

前言 目前 iOS 上的动态更新方案主要有以下 4 种: HTML 5 lua(wax)hotpatch react native framework 前面三种都是通过在应用内搭建一个运行环境来实现动态更新(HTML 5 是原生支持),在用户体验.与系统交互上有一定的限制,对开发者的要求也更高(至少得熟悉 lua 或者 js). 使用 framework 的方式来更新可以不依赖第三方库,使用原生的 OC/Swift 来开发,体验更好,开发成本也更低. 由于 Apple 不希望开发者绕过 App

StoreKit--SKStoreProductViewController

从iOS6以后苹果提供了在应用内部打开App Store中某一个应用下载页面的方式,提供了一个SKStoreProductViewController的类对该功能进行支持. 首先,需要导入#import <StoreKit/StoreKit.h>. 其次,需要遵守<SKStoreProductViewControllerDelegate>这个协议. 第三,在该类中插入如下代码即可. [objc] view plaincopyprint? - (void)showStoreProdu

高效的 iOS 应用版本支持方法

本文讲的是高效的 iOS 应用版本支持方法, 极少数应用程序很"奢侈"的只支持最新版本的 iOS. 设置一个较低的部署目标以及基于特定 iOS 版本的代码分支通常是很有必要的.虽然苹果公司的信息有些矛盾,还是有各种办法来完成这个.最近在这条 tweet上看到有人警告说,不要这样做: #define IsIOS7 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=7) GitHub

Runtime那些事儿(消息机制)

本文是投稿文章,作者:HenryCheng 一.关于runtime 之前在项目中有遇到过用runtime解决改变全局字体的问题,所以再一次感受到了runtime黑魔法的强大,趁现在有机会分享一下对runtime的一些理解.在对象调用方法是Objective-C中经常使用的功能,也就是消息的传递,而Objective-C是C的超集,所以和C不同的是,Objective-C使用的是动态绑定,也就是runtime.Objective-C的消息传递和消息机制也就不多说了,今天主要说的是动态方法,也就是函

iOS 热更新解读(二)—— JSPatch 源码解析

关于 JSPatch 的实现原理,JSPatch 作者本人 bang 已经有一系列文章阐述: JSPatch 实现原理详解 <一> 核心 JSPatch 实现原理详解 <二> 细节 JSPatch 实现原理详解 <三> 扩展 JSPatch 实现原理详解 <四> 新特性 JSPatch 实现原理详解 <五> 优化 这些文章是对 JSPatch 内部实现原理和细节诸如"require实现"."property实现&qu

如何取得ChipmunkConstraint实例对象的私有属性

在 如何用代码禁用SpriteBuilder中创建的关节 一篇中提到了要想禁用一个关节就需要将其无效化. 然后我们在重新创建新关节时,可以参考该关节的原始参数. 但是代码中只能直接访问到bodyA和bodyB两个属性,anchorA.anchorB以及minDistance.maxDistance等4个属性无法直接访问到,书上称之为这些属性为私有属性(private property).其实只要你包含了对应的头文件,就可以在自己的代码中直接引用它们. 由于这些属性值在例子中永不变化,所以书中使用

符合iOS系统兼容性需求的方法

转载本文请保留以下原作者信息: 原作:OneV's Denhttp://www.onevcat.com/2012/02/iosversion/ 兼容性,开发者之殇 兼容性问题是全世界所有开发这面临的最头疼的问题之一,这句话不会有开发者会反驳.往昔的Windows Vista的升级死掉一批应用的惨状历历在目,而如今火热的移动互联网平台上类似的问题也层出不穷.Andriod的开源导致产商繁多,不同的设备不仅硬件配置有差异,系统有差异,就连屏幕比例也有差异.想要开发出一款真正全Android平台都完美