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];
但是,这项技术的具体工作还不太清楚,因为它涉及到一种神秘的自动释放,也就是说,一种自动处理并推迟到以后某个时候的释放