我想知道如何模拟像NSString,NSArray这样的类的实例化,如下所示:[NSArray arrayWithObject:object] ...希望消除inits和alloc。
我可能不熟悉实际做的事情。根据文档,[NSSArray数组]创建并返回一个空数组。这究竟意味着什么,任何分配?
我希望能够拥有一个自定义的NSObject类并执行:[CustomObj customObjWithData:data]
谢谢!
答案 0 :(得分:5)
首先编写相应的自定义init...
方法:
- (id)initWithFoo:(Foo *)aFoo
{
// Do init stuff.
}
然后添加一个调用alloc
和您的自定义init...
方法的自定义工厂方法:
+ (id)customObjWithFoo:(Foo *)aFoo
{
return [[[self alloc] initWithFoo:aFoo] autorelease];
}
如果使用ARC进行编译,请忽略autorelease
来电。
答案 1 :(得分:0)
这些是类方法。通常,它们也有实例init *方法。例如......
- (id)initWithData:(NSData*)data
{
// Call appropriate super class initializer
if (self = [super init]) {
// Initialize instance with the data
}
return self;
}
+ (id)customObjWithData:(NSData*)data
{
return [[self alloc] initWithData:data];
}
现在,你可以称之为......
CustomObj *obj = [CustomObj customObjWithData:data];
答案 2 :(得分:-1)
您需要做类似......
的事情+ (CustomObj *)customObjWithData:(NSData *)data {
return [[[CustomObj alloc] initWithData:data] autorelease];
}
...并实现initWithData:来处理变量的初始化。
答案 3 :(得分:-1)
这里的很多答案都是正确的。我总是通过Storyboard-instantiation创建一个方便的alloc实例化方法:
// FooViewController.m
+ (id)create
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
return [storyboard instantiateViewControllerWithIdentifier:@"FooViewController"];
}
+ (UINavigationController *)createWithNavagionController
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
FooViewController *fooViewController = [storyboard instantiateViewControllerWithIdentifier:@"fooViewController"];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:fooViewController];
return navigationController;
}
如果你需要参数,创建类方法,如:createWithName:(NSString *)name