gpt4 book ai didi

objective-c - NSArray 仅在类通过时才更改

转载 作者:行者123 更新时间:2023-11-29 13:37:31 24 4
gpt4 key购买 nike

我有一个使用 ARC 的带有 NSArray 属性的类,没有什么花哨的......

#import <Foundation/Foundation.h>
@interface MyClass : NSObject
property(nonatomic, strong) (NSArray *) myArray;
@end

#import "MyClass.h"
@implementation MyClass
@synthesize myArray = _myArray;
@end

如果尝试使用另一个类内部的方法来尝试设置该数组,如果仅传递该数组,则不会设置它;但是,如果类(class)通过,它确实会设置,我不确定为什么会这样......

尝试这两种方式的代码如下...

MyClass *myClass = [[MyClass alloc] init];
[self setArrayByPassingArray:myClass.myArray];
NSLog (@"%@", myClass.myArray)
//result is null

[self setArrayByPassingClass:myClass];
NSLog (@"%@", myClass.myArray)
//result is test, test2...

-(void)setArrayByPassingArray:(NSArray *)arrayToSet {
arrrayToSet = [[NSArray alloc] initWithObjects: @"test", @"test2", nil];
}

-(void)setArrayByPassingClass:(MyClass *)classWithArrayToSet {
classWithArrayToSet.myArray = = [[NSArray alloc] initWithObjects: @"test", @"test2", nil];
}

我尝试了一些仅使用字符串的其他方法,但字符串没有改变,所以我不确定如果包含它们的类被传递,为什么它们会被改变...

最佳答案

第一个示例中的 setArrayByPassingArray: 方法将新创建的 NSArray 分配给它的参数,该参数通过值<传递/em>,并在退出方法时立即丢弃。这里发生的是在调用 setArrayByPassingArray: 之前创建了对 myArray 的引用的副本(不是数组的副本,只是对该数组的引用的副本) .该副本不再附加到 MyClassmyArray 成员。

您的第二个示例没有传递类 - 它传递了该类的一个实例,然后它正确地使用点表示法在您的实例中分配 myArray 属性.这就是第二个示例有效而第一个示例无效的原因。

如果您在整个程序中使用 NSMutableArray 而不是 NSArray,您可以重写您的第一个示例以使其工作:

-(void)setArrayByPassingArray:(NSMutableArray *)arrayToSet {
[arrrayToSet setArray:[[NSArray alloc] initWithObjects: @"test", @"test2", nil]];
}

关于objective-c - NSArray 仅在类通过时才更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10158472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com