首页 > 解决方案 > 如何初始化私有成员变量

问题描述

在下面的代码中,我想声明一个私有实例变量并将其初始化为零但是当我尝试将其初始化为零时,我收到不相关的错误“; 语句末尾应有逗号”</p>

为了解决这个问题,我试图找出这个变量被初始化的值:

-(void) startRecursion: (UIView *) uiviews {
    if (!uiviews) {
    return;
    }
    NSLog(@"numOfMethodCalls: %d", ++self->numOfMethodCalls);
    NSUInteger *countOfSubViews = [uiviews.subviews count];
}

但是,打印的日志:

2019-11-10 14:08:25.711847+0100 UIEnhancement_00[10065:383388] numOfMethodCalls: 8

请让我知道如何解决此问题

代码

@interface UIEnhancements : NSObject {
 NSUInteger *numOfMethodCalls;
}

+(id) initSelf;

标签: objective-c

解决方案


在 Objective-C 中,实例变量会自动初始化为零。

您的代码正在打印8,因为您将变量声明为NSUInteger *-*指向NSUInteger. 现在在 64 位平台上NSUInteger是 8 字节长。

(目标-)C++指针上定义运算符,以将其增加它指向的任何类型的大小。所以numOfMethodCalls被初始化为0自动然后++添加8到它。

实例变量最好是私有的,正如您所说的那样,但您已在@interface. 最好的方法是在实现中声明它:

@implementation UIEnhancements
{
   NSUInteger numOfMethodCalls;
}

...

@end

最后,尽管您没有显示您声明的实现:

+(id) initSelf;

在您的界面中。只有作为初始化方法的方法才应该以 开头init,它们是实例方法,并且在现代 Objective-C 中通常声明为返回instancetype(而不是id),这改进了编译时类型检查。总之:

- (instancetype) initSelf;

虽然如果它是你唯一的初始化方法,你应该简单地调用它init

高温高压


推荐阅读