gpt4 book ai didi

objective-c - Objective-C : class init with block ?

转载 作者:可可西里 更新时间:2023-11-01 04:26:42 24 4
gpt4 key购买 nike

是否有可能,比如说,在 View Controller 的初始化方法中使用一个 block 作为完成处理程序,以便父 View Controller 能够在 block 中填充详细信息,而无需创建自定义 initWithNibName:andResourceBundle:andThis :andThat: 对于每个可能的属性?

// ... in the didSelectRowAtIndexPath method of the main view controller :
SubViewController *subviewController = [[SubViewController alloc] initWithNibName:nil bundle:nil completionHandler:^(SubViewController * vc) {
vc.property1 = NO;
vc.property2 = [NSArray array];
vc.property3 = SomeEnumValue;
vc.delegate = self;
}];
[self.navigationController pushViewController:subviewController animated:YES];
[subviewController release];

在 SubViewController.m 中:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil completionHandler:(void (^)(id newObj))block {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
block(self);
}
return self;
}

代替

// ... in the didSelectRowAtIndexPath method of the main view controller :
SubViewController *subviewController = [[SubViewController alloc] initWithNibName:nil bundle:nil andProperty1:NO andProperty2:[NSArray array] andProperty3:SomeEnumValue andDelegate:self];
[self.navigationController pushViewController:subviewController animated:YES];
[subviewController release];

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil andProperty1:(BOOL)p1 andProperty2:(NSArray *)p2 andProperty3:(enum SomeEnum)p3 andDelegate:(id<MyDelegateProtocol>)myDelegate {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.property1 = p1;
self.property2 = p2;
self.property3 = p3;
self.delegate = myDelegate;
}
return self;
}

这样我就可以在主 Controller 中做任何我想做的事,而不是调用预定义的 init 方法(并且必须为每个可能的初始化编写一个方法)。

有什么不好的吗?会有保留周期吗?

最佳答案

您认为使用 block 有哪些优势?初始化程序通常用于设置实例的私有(private) 状态。无法从该 block 访问此私有(private)状态,因为该 block 是在其他地方实现的。

如果您只使用公共(public)属性,为什么不在初始化后设置它们?

SubViewController *vc = [[SubViewController alloc] initWithNibName:nil bundle:nil];
vc.property1 = NO;
vc.property2 = [NSArray array];
vc.property3 = SomeEnumValue;
vc.delegate = self;

这正是 block 版本所做的(没有麻烦)。

Is it something bad ? will there be retain cycles ?

不,但出于体系结构原因我会驳回您的提议:您要么破坏类的封装,要么与仅执行 block 在初始化后执行的操作相比没有任何优势。

关于objective-c - Objective-C : class init with block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12797222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com