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
Cocoa 将NSMutableArray传递给其他类_Cocoa_Arrays_Import_Mutable - Fatal编程技术网

Cocoa 将NSMutableArray传递给其他类

Cocoa 将NSMutableArray传递给其他类,cocoa,arrays,import,mutable,Cocoa,Arrays,Import,Mutable,我在类loginController的实现中创建了一个NSMutableArray。可变数组包含一组字符串。我想将可变数组及其对象传递给cocoa项目中的其他类。传递阵列的最佳方式是什么?最基本的情况是登录控制器只需将阵列的快照传递给另一个控制器。在这种情况下,登录控制器将需要引用其他类的实例,并将这些实例的某些属性设置为数组。记住用copy属性声明属性,这样接收方就不会保留您的私有可变数组 如果您希望其他控制器能够修改阵列,请不要让它们拥有您的可变阵列,这会导致难以发现的bug 相反,您需要在

我在类loginController的实现中创建了一个NSMutableArray。可变数组包含一组字符串。我想将可变数组及其对象传递给cocoa项目中的其他类。传递阵列的最佳方式是什么?

最基本的情况是登录控制器只需将阵列的快照传递给另一个控制器。在这种情况下,登录控制器将需要引用其他类的实例,并将这些实例的某些属性设置为数组。记住用
copy
属性声明属性,这样接收方就不会保留您的私有可变数组

如果您希望其他控制器能够修改阵列,请不要让它们拥有您的可变阵列,这会导致难以发现的bug

相反,您需要在登录控制器上实现一个属性,而不是在其他每个控制器上实现一个属性。登录控制器的属性应该至少有一个getter和setter(您可以
@synthesis
),但是为了提高效率,您可以实现它

拥有此属性后,其他控制器应以兼容KVO的方式访问该属性。如果您实现了特定的访问器,他们就可以使用这些访问器。否则,他们将需要向登录控制器发送
mutableArrayValueForKey:
。当他们访问代理数组的内容时,他们实际上访问了登录控制器的数组;当它们改变代理数组时,它们依次改变登录控制器的数组

接下来是实际的KVO部分。您希望其他控制器知道其中一个(或登录控制器)何时更改属性。让每个控制器(登录控制器除外)添加自己作为登录控制器属性的观察者。记住让他们在
-dealoc
(或
-finalize
)方法中删除自己

为了发布正确的通知,所有内容都需要使用访问器或
mutableArrayValueForKey:
。这也适用于登录控制器本身,它应该在改变数组时使用自己的访问器,而不是直接向数组发送消息。唯一的例外是
init
dealoc
(因为访问器消息将是指向半
init
ed/
dealoc
ked对象的消息,如果您让访问器变得花哨,这将是一个问题*)

顺便说一句,听起来你可能有太多的控制器。看看是否不能将一些逻辑移到模型对象中。这大大简化了您的代码,因为Cocoa设计用于使用模型层。重控制器意味着与框架抗争,这会为您带来更多的工作


*我所说的“花式”,是指在给定访问器方法的正常行为之外或之外做的事情。例如,
insertObject:inandex:
通常只是尾部调用
[insertObject:atIndex:
;如果您将对象插入或存储在实例变量数组之外的某个位置,或者如果您使用相同的方法执行其他操作(例如,告诉视图它需要显示),那么您的访问器方法非常奇特。

最基本的情况是您的登录控制器只需将数组的快照交给另一个控制器即可。在这种情况下,登录控制器将需要引用其他类的实例,并将这些实例的某些属性设置为数组。记住用
copy
属性声明属性,这样接收方就不会保留您的私有可变数组

如果您希望其他控制器能够修改阵列,请不要让它们拥有您的可变阵列,这会导致难以发现的bug

相反,您需要在登录控制器上实现一个属性,而不是在其他每个控制器上实现一个属性。登录控制器的属性应该至少有一个getter和setter(您可以
@synthesis
),但是为了提高效率,您可以实现它

拥有此属性后,其他控制器应以兼容KVO的方式访问该属性。如果您实现了特定的访问器,他们就可以使用这些访问器。否则,他们将需要向登录控制器发送
mutableArrayValueForKey:
。当他们访问代理数组的内容时,他们实际上访问了登录控制器的数组;当它们改变代理数组时,它们依次改变登录控制器的数组

接下来是实际的KVO部分。您希望其他控制器知道其中一个(或登录控制器)何时更改属性。让每个控制器(登录控制器除外)添加自己作为登录控制器属性的观察者。记住让他们在
-dealoc
(或
-finalize
)方法中删除自己

为了发布正确的通知,所有内容都需要使用访问器或
mutableArrayValueForKey:
。这也适用于登录控制器本身,它应该在改变数组时使用自己的访问器,而不是直接向数组发送消息。唯一的例外是
init
dealoc
(因为访问器消息将是指向半
init
ed/
dealoc
ked对象的消息,如果您让访问器变得花哨,这将是一个问题*)

顺便说一句,听起来你可能有太多的控制器。看看是否不能将一些逻辑移到模型对象中。这大大简化了您的代码,因为Cocoa设计用于使用模型层。重控制器意味着与框架抗争,这会为您带来更多的工作

*我所说的“花式”,是指在给定访问器方法的正常行为之外或之外做的事情。例如,
insertObject:inandex:
norma
[otherObject giveArray:[NSArray arrayWithArray:theMutableArray]];
 NSMutableArray* myArr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"four",nil];
 // maybe modify the array here...
 NSArray* nonMut = [[myArr copy] autorelease];
 [someObject doWork:nonMut];
@protocol LoginControllerDelegate <NSObject>

@optional
- (void)loginController:(LoginController *)loginController didReceiveLoginIDs:(NSArray *)ids;

@end
@property (nonatomic, assign) id <LoginControllerDelegate> delegate;
if ([self.delegate respondsToSelector:@selector(loginController:didReceiveLoginIDs:])
    [self.delegate loginController:self didReceiveLoginIDs:[NSArray arrayWithArray:loginIDs]];
@interface SomeOtherClass : NSObject <LoginControllerDelegate>