指针的自定义对象数组都指向同一个对象
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
实例保存 matrix
和 quality
值,请像这样使用 @property
。
@interface Pixra : NSObject
@property (strong) UIImage *matrix;
@property (assign) CGFloat quality;
@end
请注意,此 属性 实现涵盖了 setMatrix
和 matrix
属性 方法。在 google.
中查看有关 Objective-C Class Property 的更多详细信息
这是我的第一个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
实例保存 matrix
和 quality
值,请像这样使用 @property
。
@interface Pixra : NSObject
@property (strong) UIImage *matrix;
@property (assign) CGFloat quality;
@end
请注意,此 属性 实现涵盖了 setMatrix
和 matrix
属性 方法。在 google.