0

可能重复:
创建新实例的类方法

我想知道如何模拟 NSString、NSArray 等类的实例化:[NSArray arrayWithObject:object] ... 希望消除初始化和分配。

我可能不熟悉它的实际作用。根据文档, [NSSArray array] 创建并返回一个空数组。这到底是什么意思,任何分配?

我希望能够拥有一个自定义 NSObject 类并执行以下操作:[CustomObj customObjWithData:data]

谢谢!

4

4 回答 4

5

先写一个对应的自定义init...方法:

- (id)initWithFoo:(Foo *)aFoo
{
     // Do init stuff.
}

然后添加一个调用的自定义工厂方法alloc和您的自定义init...方法:

+ (id)customObjWithFoo:(Foo *)aFoo
{
    return [[[self alloc] initWithFoo:aFoo] autorelease];
}

如果使用 ARC 编译,则省略autorelease调用。

于 2012-04-13T19:08:22.913 回答
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];
于 2012-04-13T19:06:23.860 回答
-1

这里的很多答案都是正确的。我总是自己创建一个通过 Storyboard-instantiation 轻松进行 alloc en 实例化的方法:

//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

于 2012-04-13T20:15:39.910 回答
-1

你需要做类似的事情......

+ (CustomObj *)customObjWithData:(NSData *)data {
    return [[[CustomObj alloc] initWithData:data] autorelease];
}

...并实现一个 initWithData: 来处理变量的初始化。

于 2012-04-13T19:04:59.620 回答