指针的自定义对象数组都指向同一个对象

Custom object array of pointers all points to the same object

这是我的第一个post,如果有点乱,请见谅。

我想动态添加我在 NSMutableArray 中创建的自定义对象 Pixra。因为它使用了一个接口,所以我用一个指针来实例化我的对象:Pixra* pix = [Pixra alloc];.

当我解析我的数组时,我可以看到我添加的所有指针都指向同一个对象,因为 属性 quality 的值对于数组的所有元素都是相同的.这是我在数组中添加元素的循环实现。

NSMutableArray* imagesRaw = [NSMutableArray array];
double j=0.0;
for (UIImage* img in images){
  Pixra* pix = [Pixra alloc];
  [pix setMatrix:img];
  [pix setQuality:j];
  [imagesRaw addObject:pix];
  cout << [imagesRaw[0] getQuality] << "\n";
  j++;
} 

控制台日志显示质量在迭代,但它不应该是因为我只显示数组的第一个元素。

Pixra.mm

#import <Foundation/Foundation.h>
#import "Pixra.h"
@implementation Pixra

UIImage* matrix;
double quality;

-(void) setMatrix:(UIImage*)matrixArg{
  matrix = matrixArg;
}
-(UIImage*) getMatrix{
  return matrix;
}
-(void) setQuality:(double)qualityArg{
  quality = qualityArg;
}
-(double) getQuality{
  return quality;
}
-(id) pixraInit:(UIImage*)img:(double)quality{
  self = [super init];
  self.matrix = img;
  self.quality = quality;
  return self;
}
+(instancetype) pixraInit:(UIImage*)img:(double)quality{
  Pixra* pix = [[Pixra alloc] pixraInit:img :quality];
  return pix;
}
@end

Pixra.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class Pixra;
@interface Pixra : NSObject
-(void) setMatrix:(UIImage*)matrixArg;
-(UIImage*) getMatrix;
-(void) setQuality:(double)qualityArg;
-(double) getQuality;
+(instancetype) pixraInit:(UIImage*)img :(double)quality;
@end

如您所见,我尝试使用 returns 实例的初始化器来完成此操作,但它也没有用。 如何在自定义对象的不同实例上创建指针?

你忘了init

Pixra* pix = [Pixra alloc];

来自 NSObject's init() method 的文档:

An object isn’t ready to be used until it has been initialized.

In some cases, a custom implementation of the init() method might return a substitute object. You must therefore always use the object returned by init(), and not the one returned by alloc or allocWithZone:, in subsequent code

所以替换

Pixra* pix = [Pixra alloc];

Pixra* pix = [[Pixra alloc] init];

Pixra* pix = [Pixra new];

当你在class实现文件中这样写的时候,编译器会把它当作全局变量。每个只有一块内存。

UIImage* matrix;
double quality;

有了这些属性,所有Pixra对象实例都使用全局变量来保存它们,它通常用于Sington Instance设计模式。

那么如何纠正呢?如果您正在寻找正确的属性来为每个 Pixra 实例保存 matrixquality 值,请像这样使用 @property

@interface Pixra : NSObject

@property (strong) UIImage *matrix;
@property (assign) CGFloat quality;

@end

请注意,此 属性 实现涵盖了 setMatrixmatrix 属性 方法。在 google.

中查看有关 Objective-C Class Property 的更多详细信息