arc 中没有 return 值的 init** 方法会发生什么情况?
what would happen for a init** method without return value in arc?
arc 命名约定中说:init*** 方法的 return 值将由调用者保留,但如果我写了一个没有 return 值的 init*** 方法,它会导致 ARC 中出现一些内存问题吗?
- (void)initToolbar
{
// 工具栏
UIButton *commendEditButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 0, [Utils getScreenAppSize].width - 15 *2, 32)];
commendEditButton.backgroundColor = [UIColor whiteColor];
commendEditButton.layer.borderColor = UIColorFromRGB(0xb6b6b6).CGColor;
commendEditButton.layer.cornerRadius = 4.f;
commendEditButton.layer.borderWidth = .5f;
[commendEditButton addTarget:self action:@selector(showCommentCompose) forControlEvents:UIControlEventTouchUpInside];
[commendEditButton setImage:[UIImage imageNamed:@"comment-ico-compose"] forState:UIControlStateNormal];
[commendEditButton setImage:[UIImage imageNamed:@"comment-ico-compose"] forState:UIControlStateHighlighted];
[commendEditButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[commendEditButton setImageEdgeInsets:UIEdgeInsetsMake(0, 10, 0, 0)];
[commendEditButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 15, 0, 0)];
[commendEditButton.titleLabel setFont:[UIFont systemFontOfSize:15.0f]];
[commendEditButton setTitleColor:UIColorFromRGB(0xc4c4c4) forState:UIControlStateNormal];
[commendEditButton setTitle:@"发表评论" forState:UIControlStateNormal];
NSArray *toolbarItems = [NSArray arrayWithObjects:[[UIBarButtonItem alloc] initWithCustomView:commendEditButton],nil];
_toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, [Utils getScreenSize].height - UI_TOOL_BAR_HEIGHT - UI_STATUS_BAR_HEIGHT - UI_NAVIGATION_BAR_HEIGHT, [Utils getScreenAppSize].width, UI_TOOL_BAR_HEIGHT)];
[_toolBar setBackgroundImage:[UIImage imageNamed: @"toolbar_bg.png"] forToolbarPosition:UIToolbarPositionBottom barMetrics:UIBarMetricsDefault];
_toolBar.items = toolbarItems;
}
如果您不算违反许多代码质量规则,就不会发生真正糟糕的事情。
@implementation A
- (void)initTest {
// do nothing
}
@end
A *instance = [A alloc];
[instance initTest];
请注意实例仍然是强引用的,我们甚至没有调用 [super init]
。
但我们在这里很幸运,因为 init
在 NSObject
上什么都不做。
实际上,这非常依赖于超类,理论上这是未定义的行为。当前的实现允许一切正常工作,但它确实是糟糕的代码。
arc 命名约定中说:init*** 方法的 return 值将由调用者保留,但如果我写了一个没有 return 值的 init*** 方法,它会导致 ARC 中出现一些内存问题吗?
- (void)initToolbar
{
// 工具栏
UIButton *commendEditButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 0, [Utils getScreenAppSize].width - 15 *2, 32)];
commendEditButton.backgroundColor = [UIColor whiteColor];
commendEditButton.layer.borderColor = UIColorFromRGB(0xb6b6b6).CGColor;
commendEditButton.layer.cornerRadius = 4.f;
commendEditButton.layer.borderWidth = .5f;
[commendEditButton addTarget:self action:@selector(showCommentCompose) forControlEvents:UIControlEventTouchUpInside];
[commendEditButton setImage:[UIImage imageNamed:@"comment-ico-compose"] forState:UIControlStateNormal];
[commendEditButton setImage:[UIImage imageNamed:@"comment-ico-compose"] forState:UIControlStateHighlighted];
[commendEditButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[commendEditButton setImageEdgeInsets:UIEdgeInsetsMake(0, 10, 0, 0)];
[commendEditButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 15, 0, 0)];
[commendEditButton.titleLabel setFont:[UIFont systemFontOfSize:15.0f]];
[commendEditButton setTitleColor:UIColorFromRGB(0xc4c4c4) forState:UIControlStateNormal];
[commendEditButton setTitle:@"发表评论" forState:UIControlStateNormal];
NSArray *toolbarItems = [NSArray arrayWithObjects:[[UIBarButtonItem alloc] initWithCustomView:commendEditButton],nil];
_toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, [Utils getScreenSize].height - UI_TOOL_BAR_HEIGHT - UI_STATUS_BAR_HEIGHT - UI_NAVIGATION_BAR_HEIGHT, [Utils getScreenAppSize].width, UI_TOOL_BAR_HEIGHT)];
[_toolBar setBackgroundImage:[UIImage imageNamed: @"toolbar_bg.png"] forToolbarPosition:UIToolbarPositionBottom barMetrics:UIBarMetricsDefault];
_toolBar.items = toolbarItems;
}
如果您不算违反许多代码质量规则,就不会发生真正糟糕的事情。
@implementation A
- (void)initTest {
// do nothing
}
@end
A *instance = [A alloc];
[instance initTest];
请注意实例仍然是强引用的,我们甚至没有调用 [super init]
。
但我们在这里很幸运,因为 init
在 NSObject
上什么都不做。
实际上,这非常依赖于超类,理论上这是未定义的行为。当前的实现允许一切正常工作,但它确实是糟糕的代码。