objective-c - 如何初始化私有成员变量
问题描述
在下面的代码中,我想声明一个私有实例变量并将其初始化为零但是当我尝试将其初始化为零时,我收到不相关的错误“; 语句末尾应有逗号”</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 中,实例变量会自动初始化为零。
您的代码正在打印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
。
高温高压
推荐阅读
- jsf - JSF渲染嵌入式面板列表ajax不起作用
- python - Python Unittest Discover即使失败也返回退出代码0
- python-3.7 - 强类型 python3.7 - 返回类型和参数不失败
- jekyll - netlify cms 管理员登录时未捕获的类型错误
- node.js - 使用 mod_cluster willdfly 将 url apache 重写为 nodeJS 的问题
- jquery - 发送 Ninja Forms 表单时,jQuery“提交”不起作用
- mysql - MySQL 错误 #1415 - 不允许从函数返回结果集
- user-interface - 创建 Maya 内容浏览器 ui
- python - 从服务器获取表名
- c# - 在 Azure 中并行运行单线程