来自Java等人,我不清楚这两个声明之间的区别:
@property (nonatomic, readwrite) NSInteger score;
@property (nonatomic, strong) NSMutableArray *cards;
为什么指针*不是两个属性声明的要求?
我在局部变量中也看到了很多:
- (void)viewDidLoad
{
[super viewDidLoad];
int foo = 1;
NSString *bar = @"foo";
}
基本类型int和NS类型的静态分配有什么区别?
答案 0 :(得分:4)
Objective-C对象总是在堆上分配,因此您始终可以通过指针访问它们。原始(或结构)类型的变量可以并且通常在堆栈上分配,并且在没有指针的情况下访问。
如果您熟悉Java,它基本上是相同的语义。原始类型通过值访问和传递,对象通过引用传递。不同之处在于ObjC(凭借其C谱系)语法明确标记了这种差异。
Apple框架中以大写前缀开头的类型名称并非都是ObjC类。 NSInteger
是一种原始类型,就像int
一样,所以你可以并且通常在没有指针的情况下使用它。
答案 1 :(得分:2)
指针始终用于引用堆中的某些内容,但在引用堆栈中的某些内容时则不会。但是 对于一些原始类型和简单的结构,可以通过堆栈访问,因此您不需要使用指针..
NSInteger 是一种基本类型,这意味着它将本地存储在堆栈中。没有必要使用指针来访问它,但如果你想使用指针,那么你可以。
如果你真的想用以下方式,你可以有一个指向 NSInteger 的指针:
NSInteger * pointerToProcessID =& yourNsintegervar;
答案 2 :(得分:1)
如果你看一下NSInteger
的定义,你会发现它是一个简单整数的typedef。基本上,所有非对象类型都存储为简单值,而复杂对象的类型通常是指针属性。将这些更复杂的对象存储为指针有几个原因:
使用值本身而不是指针需要复制(也就是说,如果你使用指针,你可以将对象放在其他地方,你只需要复制更短的地址而不是全部恰好在该对象中的内容,因此它的效率更高。)
使用非指针类型时,必须知道所需的存储空间,如果您知道对象的确切类型,则会有效,但在继承的情况下会失败(例如,NSMutableArray可能会添加额外的例如,对于NSArray的字段。如果您使用NSArray
而不是NSArray*
,那么从NSMutableArray
分配将被破坏,因为系统只留出足够的空间用于但是,当使用指针时,由于指针大小对于基类和派生类型都是相同的,因此可以将派生类型的指针指定给指向基类型的指针。 ,并且仍然可以正常工作)。
请注意,使用具有这些基本类型的指针类型也是可行且安全的;但是,这不是出于效率原因而做的(它会在没有必要的情况下创建额外的分配和解除引用)。