Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用中介来初始化对象_Objective C_Cocoa_Initialization_Properties_Conventions - Fatal编程技术网

Objective c 使用中介来初始化对象

Objective c 使用中介来初始化对象,objective-c,cocoa,initialization,properties,conventions,Objective C,Cocoa,Initialization,Properties,Conventions,我一直看到我们使用中间对象,例如,创建一个数组来填充另一个数组: characters = [[NSArray alloc] initWithObjects:@"Antony", @"Artemidorus", @"Brutus", nil]; play.characters = characters; [characters release]; 将字符作为对象播放中的NSArray 我在@属性及其自身中看到了同样的情况:我们没有将新项目直接添加到此属性中,就像我们没有在上面的示例

我一直看到我们使用中间对象,例如,创建一个数组来填充另一个数组:

characters = [[NSArray alloc] initWithObjects:@"Antony", @"Artemidorus", @"Brutus", nil];  
play.characters = characters;  
[characters release];  
字符
作为对象
播放
中的
NSArray


我在
@属性及其
自身
中看到了同样的情况:我们没有将新项目直接添加到此属性中,就像我们没有在上面的示例中直接填写
字符一样。这只是关于“风格”的吗?这不是风格的问题

play.characters
是一个属性,可以“包含”现有数组或
nil
,但即使它“包含”现有数组,也不能更改
NSArray
的内容,因此必须创建一个新数组并将其分配给属性


如果声明正确,分配给属性将导致其setter方法运行(如果您使用
@synthetic
,则可以由编译器创建,或者由您在代码中编写),这将负责删除任何现有数组,分配新数组并保留它。

这不是风格问题

play.characters
是一个属性,可以“包含”现有数组或
nil
,但即使它“包含”现有数组,也不能更改
NSArray
的内容,因此必须创建一个新数组并将其分配给属性


如果all声明正确,则分配给属性将导致其setter方法运行(如果您使用
@synthesis
,则可以由编译器创建,或者由您在代码中编写),这将负责删除任何现有数组,分配新的数组并保留它。

在这段代码中实际上只有一个数组

中间的不是数组,而是包含指向它的指针的变量——在本例中是变量字符

情况就是这样:

表情

[[NSArray alloc] initWithObjects:@"Antony", @"Artemidorus", @"Brutus", nil] 
分配一个对象并用三个NSString初始化它(它们本身就是对象,但让我们暂时忽略这一点)。初始化还包括保留计数的增量,因此它是从开始到开始的一个增量

这个新创建的对象位于内存中的给定位置,比如0100H。然后,该位置存储在变量
characters
中。在C语言中,我们说
字符
是指向对象的指针

然后将对象的属性
@“characters”
设置为指向内存中与局部变量
characters
相同的位置。因此,现在有两个变量(其中一个也是属性)指向同一个对象,或者,如果您愿意,指向内存中的同一位置。如果属性的类型为retain,这将自动增加对象的retain计数,因此现在为2

当释放消息位于最后一行时,对象将其保留计数递减1,因此在此代码段末尾,对象由
play.characters
属性指向,其保留计数为1

为了真正干净,这段代码可能应该将局部变量设置为
nil
,以避免持有指向对象的指针的变量和保留计数之间的混淆

所有这些都是为了表明这里实际上只有一个数组,但有两个变量指向它。因此,浪费的计算机资源并不像乍一看那样多

如果你想在一行中完成这一切,你可以这样写:

play.characters = [[[NSArray alloc] initWithObjects:@"Antony", @"Artemidorus", @"Brutus", nil] autorelease];
但是,这项技术的具体工作还不太清楚,因为它涉及到一种神秘的自动释放,即自动处理并推迟到稍后阶段的释放


这是一个很长的描述,但我希望它能让我们了解正在发生的事情。

在这段代码中实际上只有一个数组

中间的不是数组,而是包含指向它的指针的变量——在本例中是变量字符

情况就是这样:

表情

[[NSArray alloc] initWithObjects:@"Antony", @"Artemidorus", @"Brutus", nil] 
分配一个对象并用三个NSString初始化它(它们本身就是对象,但让我们暂时忽略这一点)。初始化还包括保留计数的增量,因此它是从开始到开始的一个增量

这个新创建的对象位于内存中的给定位置,比如0100H。然后,该位置存储在变量
characters
中。在C语言中,我们说
字符
是指向对象的指针

然后将对象的属性
@“characters”
设置为指向内存中与局部变量
characters
相同的位置。因此,现在有两个变量(其中一个也是属性)指向同一个对象,或者,如果您愿意,指向内存中的同一位置。如果属性的类型为retain,这将自动增加对象的retain计数,因此现在为2

当释放消息位于最后一行时,对象将其保留计数递减1,因此在此代码段末尾,对象由
play.characters
属性指向,其保留计数为1

为了真正干净,这段代码可能应该将局部变量设置为
nil
,以避免持有指向对象的指针的变量和保留计数之间的混淆

所有这些都是为了表明这里实际上只有一个数组,但有两个变量指向它。因此,浪费的计算机资源并不像乍一看那样多

如果你想在一行中完成这一切,你可以这样写:

play.characters = [[[NSArray alloc] initWithObjects:@"Antony", @"Artemidorus", @"Brutus", nil] autorelease];
但是,这项技术的具体工作还不太清楚,因为它涉及到一种神秘的自动释放,也就是说,一种自动处理并推迟到以后某个时候的释放