Objective C 数组元素都以相同的值结束

2023-12-29

首先,如果这是一个相当基本的问题,我深表歉意,但是我是 Objective C 的新手,并且在我所有的搜索中都无法找到我的问题的答案(尽管这很可能是因为我是新手而不是新手)在寻找答案时相当使用正确的术语!)

我有一个简单的循环,在其中我用一些自定义对象填充 NSMutableArray。我发现循环之后,我有一个数组,其元素似乎都具有相同的值:即插入 (0,1,2,3) 后,我发现我的数组包含 (3,3,3,3) 。

仅在使用我的对象时才出现此问题;我只向第二个数组添加字符串,最终填充了预期值。

查看数组中对象的地址,我发现它们都是不同的:我是否正确地认为这意味着我不只是拥有引用同一对象的指针数组?

我想了解为什么这没有达到我的预期。我有一种感觉,我缺少一些非常基本的东西,任何见解将不胜感激。

这是我执行的循环:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"STARTING");
    NSMutableArray* myArray1 = [NSMutableArray array];
    NSMutableArray* myArray2 = [NSMutableArray array];

    for (int i=0; i < 4; i++) {
        MyObject* obj = [[MyObject alloc] initWithSomeString: [NSString stringWithFormat: @"ID%u", i] 
                                                  AndSomeNum: i];
        [myArray1 addObject: obj];
        [myArray2 addObject: [NSString stringWithFormat: @"ID%u", i]];

        NSLog(@"  Added to array1: %@", [myArray1 objectAtIndex: i]);
        NSLog(@"       and array2: %@", [myArray2 objectAtIndex: i]);
    }

    NSLog(@"ALL DONE:\nARRAY1=%@\nARRAY2=%@", myArray1, myArray2);
}

运行后得到的输出是:

STARTING
   Added to array1: num=0 self=<0x928e9b0> str=<0x9290090> str=ID0
        and array2: ID0
   Added to array1: num=1 self=<0x9290080> str=<0x928ff80> str=ID1
        and array2: ID1
   Added to array1: num=2 self=<0x928eb00> str=<0x9290020> str=ID2
        and array2: ID2
   Added to array1: num=3 self=<0x7499a30> str=<0x7499ae0> str=ID3
        and array2: ID3
ALL DONE:
ARRAY1=(
    "num=3 self=<0x928e9b0> str=<0x7499ae0> str=ID3",
    "num=3 self=<0x9290080> str=<0x7499ae0> str=ID3",
    "num=3 self=<0x928eb00> str=<0x7499ae0> str=ID3",
    "num=3 self=<0x7499a30> str=<0x7499ae0> str=ID3"
)
ARRAY2=(
    ID0,
    ID1,
    ID2,
    ID3
)

这是 MyObject 类的实现:

@implementation MyObject

NSString* _blah;
int _num;

-(MyObject*)initWithSomeString: (NSString*)blah AndSomeNum: (int)num {
    self = [super init];
    _blah = [NSString stringWithString: blah];
    _num = num;
    return self;
}

-(NSString*)description {
    return [NSString stringWithFormat: @"num=%u self=<%p> str=<%p> str=%@", _num, self, _blah, _blah];
}

@end

这里的问题是你对这两个变量的定义:

NSString* _blah;
int _num;

当您将它们放置在该文件中时,它们被定义为全局变量。所以你的类的每个实例都共享这两个相同的变量。这就是为什么每次调用初始化程序时,相同的“_blah”都会被覆盖。

如果你想让他们成为instance变量,每个实例都有自己的“_blah”和“_num”,那么您需要在类的实现或接口中的 {} 中声明它们。所以这可以作为一个例子:

@implementation MyObject {

 NSString* _blah;
 int _num;

} // continue with method definitions...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective C 数组元素都以相同的值结束 的相关文章

随机推荐

  • 链接问题:致命错误 LNK1112:模块机器类型“x64”与目标机器类型“X86”冲突

    我正在尝试从 wxFreeChart 库运行示例应用程序 编译链接后出现错误 wxcode msw28d freechart lib wxfreechart lib xydataset obj fatal error LNK1112 mod
  • vb6 数组,上限为 -1

    一些功能例如Split 如果数组没有项 将返回一个数组 其中 1 为上限 0 为下限 例如 Dim s As String s Split Debug Print UBound s Debug Pring LBound s 在这种情况下 U
  • 如何获取包含字符串的列表的索引

    我有一个List
  • 在运行时加载程序集

    我的项目是一个应用程序 我们在其中加载各种程序集并对它们执行操作 我们陷入了这样一种情况 我们需要添加对我们加载的程序集的引用 将由用户选择 所以我需要在运行时添加对DLL的引用 I tried 这个网站 http www codeproj
  • android updateLocaleListFromAppContext NullPointerException 中的问题

    最近我的应用程序崩溃并显示以下错误 我无法检测到实际问题是什么 也无法检测到崩溃 如果有人对此崩溃有解决方案 请帮助解决此问题 java lang NullPointerException at android app ActivityTh
  • 编写一个例程来创建顺序记录

    我想编写一个例程 它允许我在跨越设定时间范围的表中获取带日期的事件 记录 并且在特定日期没有发生事件的情况下 将创建一个重复最多的事件最近确实发生过事件的记录 例如 如果在 9 月 4 日 字段 1 X 字段 2 Y 和字段 3 Z 然后直
  • 如何删除通过 jQuery 插入的引导模式?

    我决定拥有一个可以在需要插入自定义 Bootstrap 模式时使用的脚本 我不想让空的静态 Bootstrap 模式 HTML 位于每个页面的底部 如果它不总是被利用的话 所以 这可能是错误的做法 但这是我的尝试 我创建了一个变量 它是模式
  • 从 Java 连接到 OLEDB 数据源?

    我们正在尝试连接到 ACT CRM 系统使用的 SQL Server 实例 他们设法锁定了一切 因此无法使用 ODBC 连接到 SQL 后端 有一些特殊的实用程序可以添加 ODBC 支持 如果您购买了该软件的 primo 版本 则可以安装它
  • 在 Android 应用程序中嵌入广告?

    我想制作一个我拥有的 Android 应用程序的免费版本 但想在其中嵌入广告 我不知道应该从哪里开始 有没有一家专门从事移动广告的知名移动广告公司 我个人都用过Admob http www admob com and Adsense htt
  • 如何在 opencv 2.4.11 python 中调整轮廓大小? (目标:对象提取)

    我对 opencv 非常陌生 所以请原谅我的无知 基本上 我的图像中有一个感兴趣的对象 我想把它提取出来 我的问题是由于缩小原始图像的尺寸以方便处理而产生的 我在较小的图像上找到了物体的轮廓 我真正想做的是使用有关该轮廓的信息从原始全尺寸图
  • 具有声明的宽度和高度的图像在加载前呈现正方形

    我有声明宽度和高度的图像 例如 img src foo jpg width 1500 height 1800 alt bar 它们位于响应式网格内 因此它们显示在max width 100 它们是延迟加载的 问题是 尽管有height au
  • 对于表示返回 void 的操作的任务,Task.FromResult() 的替代方案是什么[重复]

    这个问题在这里已经有答案了 返回没有泛型类型参数的任务的最佳方法是什么 换句话说 任务代表不返回任何内容或返回任何内容的操作void 换句话说 我正在寻找以下替代方案 T value default T return Task FromRe
  • 如何在切换 Bootstrap 3 面板时为 V 形字形图标设置动画?

    我有一个用 Bootstrap 3 手风琴包裹的面板的工作解决方案 如何通过 90 度旋转将 V 形状态从 gt 更改为 panel heading accordion toggle after font family Glyphicons
  • Django:is_valid 和 form_valid 之间的区别

    我创建了一个表单 它是forms ModelForm 在 视图 方面 我创建了一个视图 它是generic UpdateView 在这两个不同的班级中 我有is valid 一侧 并且form valid 另一方面 class Profil
  • W3Schools 试用编辑器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道如何获得 或在哪里获得 或如何制作 或在哪里可以找到关于w3schools 尝试一下编辑器 h
  • 如何将扩展编译成sqlite?

    我想将扩展编译到 sqlite 中以便在运行时加载 我使用的文件扩展名为 functions c 来自https www sqlite org contrib https www sqlite org contrib 我已经能够编译成可加载
  • 在 Rails 中使用域逻辑回调的优点和缺点

    您认为使用领域逻辑回调的优点和缺点是什么 我是在 Rails 和 或 Ruby 项目的背景下谈论的 为了开始讨论 我想提一下来自关于回调的 Mongoid 页面 http mongoid org en mongoid docs callba
  • 从命令行在 Firefox 上安装 WebExtensions

    我找到了问题如何在脚本中从命令行安装 Firefox 插件 https askubuntu com questions 73474 how to install firefox addon from command line in scri
  • 如何在没有 UI 的情况下启动 Activity?

    是否可以在没有 UI 的情况下从主函数启动 Activity 即是否有一种方法可以围绕另一个活动创建一种 包装器 即通过启动主要活动 它会自动将您带到另一个活动 如果这是不可能的 是否有办法从堆栈中删除主要活动 以便单击后退按钮不会将您带到
  • Objective C 数组元素都以相同的值结束

    首先 如果这是一个相当基本的问题 我深表歉意 但是我是 Objective C 的新手 并且在我所有的搜索中都无法找到我的问题的答案 尽管这很可能是因为我是新手而不是新手 在寻找答案时相当使用正确的术语 我有一个简单的循环 在其中我用一些自