- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我学习 Objective-C 有一段时间了。据我了解,我知道当你在 .h 文件的 @interface
中声明一个变量时,可以公开访问该变量(类似于 java 中的公共(public)变量).
@interface MyObject
@property NSInteger intData;
@end
但是当您在.m 文件 的@interface
中声明它时。它只能在 @implementation 下的 .m 文件中访问,除非你为它提供 getter 和 setter。
@interface MyObject ()
@property NSInteger intData;
@end
但是我也注意到另一种声明变量的方式,就是在@implementation
下声明它
@implementation
NSInteger intData;
@end
而且我发现它的工作方式与在 @interface
下使用 @property
在 .m 文件中声明它的方式相同
我不明白两者之间的区别(在@implementation 下声明和在@interface 下声明(在.m 文件)。
我已经在堆栈中搜索过这个,但他们都在谈论@implementation 和@interface(在.h 文件 中)之间的区别。所以认为这不是重复的。
最佳答案
首先,您没有声明变量;你在申报属性(property)。属性由实例变量支持,但它也添加了方法。以下是对放置变量的位置的解释:
@interface MyClass : NSObject {
NSInteger i ;
}
@end
这是在您的类上放置实例变量的地方。它只能通过您的类和类别的方法访问。 (旁注:它可以从外部访问,但这不是推荐的做法)
另一个例子:
@interface MyClass : NSObject
@end
@implementation MyClass {
NSInteger i ;
}
@end
这也是一个实例变量,但只能通过在该 block 内编写的方法访问。 (旁注:可以通过挖掘类定义来访问它,但这不是推荐(或常见)的做法)
另一个例子:
@interface MyClass : NSObject
@property NSInteger i ;
@end
等同于:
@interface MyClass : NSObject {
NSInteger _i ; // you are not allowed to access it by this variable
}
- (NSInteger) i ;
- (void) setI:(NSInteger)value ;
@end
这是一个允许人们获取和设置的属性。您在您的方法或其他方法中将该变量用作:
NSLog ( @"The value is %i" , self.i ) ; // if it's your instance method
NSLog ( @"The value is %i" , object.i ) ; // if it's object's instance method
另一个例子:
@interface MyClass : NSObject {
NSInteger i ;
}
@property NSInteger i ;
@end
@implementation MyClass
@synthesize i ; // Causes the property to line up with the ivar by the same name.
@end
等同于:
@interface MyClass : NSObject {
NSInteger i ; // you ARE allowed to use this since you defined it
}
- (NSInteger) i ;
- (void) setI:(NSInteger)value ;
@end
在这里,您可以使用 getter/setter 方法或实例变量本身。但是,您通常应该使用这些方法,因为您 [隐式] 将它们声明为原子的,因此它们具有线程同步。如果你想让它不做线程(并加速它,只要你不打算在多线程环境中使用它):
@property (nonatomic) NSInteger i ;
@property (nonatomic,readonly) NSInteger i ; // only makes a getter method
我建议暂时避免这种情况并使用直接属性,因为它会帮助您避免很多常见错误。除非您分析您的程序并确定这是性能损失的原因,否则您应该只使用这些属性。
另一个例子:
@interface MyClass : NSObject
@end
@implementation MyClass
NSInteger i ;
@end
这不是实例变量。它是一个全局变量,恰好写在您的 @implementation
范围内。
请参阅上文了解如何将其转换为实例变量(即将其放在大括号中)。
再补充一点:
像这样声明一个属性:
@interface MyClass ()
@property NSInteger i ;
@end
不会将其设为私有(private)。但是,它隐藏在人们通常无法访问的文件中,因此编译器不知道属性的存在。
代码中其他地方的其他函数仍然可以调用:
[yourObject i] ;
要获取该属性的值 - 但他们必须首先知道它在那里。
附录回答评论中的问题:
默认情况下,属性是原子的。它不一定遵循原子 的严格定义(这是一堆蠕虫,我建议你现在不要看),但具有相同的效果:线程保证看到一个完整的和向上的-最新值,无论另一个线程何时写入它。它通常在合成 getter/setter 方法时这样做:
- (NSInteger) i {
@synchronized(self) {
return i ;
}
}
- (void) setI:(NSInteger)value {
@synchronized(self) {
i = value ;
}
}
如果您改为指定 nonatomic
,它将合成这些:
- (NSInteger) i {
return i ;
}
- (void) setI:(NSInteger)value {
i = value ;
}
如果您的属性是 atomic
,那么您不应该直接访问 ivar。这样做违反了您一开始就赋予它的线程保护。 (旁注:在某些情况下您可以,但请等到您对线程/同步更加熟悉后再尝试。)
关于objective-c - 在.m文件下@Implementation和@Interface下声明变量的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31895332/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!