自定义NSObject类,实例化如[CustomObj customObjWithData:data]

时间:2012-04-13 18:55:18

标签: objective-c ios memory-management nsobject

  

可能重复:
  Class methods which create new instances

我想知道如何模拟像NSString,NSArray这样的类的实例化,如下所示:[NSArray arrayWithObject:object] ...希望消除inits和alloc。

我可能不熟悉实际做的事情。根据文档,[NSSArray数组]创建并返回一个空数组。这究竟意味着什么,任何分配?

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

谢谢!

4 个答案:

答案 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