我试图澄清一些关于实施的问题copyWithZone:,任何人都可以评论以下内容......
// 001: Crime is a subclass of NSObject.
- (id)copyWithZone:(NSZone *)zone {
Crime *newCrime = [[[self class] allocWithZone:zone] init];
if(newCrime) {
[newCrime setMonth:[self month]];
[newCrime setCategory:[self category]];
[newCrime setCoordinate:[self coordinate]];
[newCrime setLocationName:[self locationName]];
[newCrime setTitle:[self title]];
[newCrime setSubtitle:[self subtitle]];
}
return newCrime;
}
// 002: Crime is not a subclass of NSObject.
- (id)copyWithZone:(NSZone *)zone {
Crime *newCrime = [super copyWithZone:zone];
[newCrime setMonth:[self month]];
[newCrime setCategory:[self category]];
[newCrime setCoordinate:[self coordinate]];
[newCrime setLocationName:[self locationName]];
[newCrime setTitle:[self title]];
[newCrime …Run Code Online (Sandbox Code Playgroud) 我觉得我正在把头撞到墙上(坦白说,我准备好了).
我正在尝试为视图设置背景.我需要设置的背景是一个图像,我正在使用这个代码(在其他两个UIViewController子类中运行得很好 - 这是复制/粘贴到新文件中):
UIImage *img = [gameNode imageFromKey:@"background"];
UIColor *bg = [[UIColor alloc] initWithPatternImage:img];
self.view.backgroundColor = bg;
[bg release];
Run Code Online (Sandbox Code Playgroud)
正如我所说,这在其他两个地方完美无缺,但是在这里,线路self.view.backgroundColor = bg投掷
'NSInvalidArgumentException', reason: '-[UILabel copyWithZone:]: unrecognized selector sent to instance 0x9259840'
Run Code Online (Sandbox Code Playgroud)
没有更多的东西可以去了.我在IB中验证了顶级视图的引用插座已设置为文件的所有者.我清理了项目并重新启动.我甚至关闭了Xcode并重新启动它 - 没有运气.我还缺少什么?
编辑: 正如我所提到的,没有太多的后栈跟踪,只是这样:
2012-05-28 13:13:56.997 OOKL[36012:17303] -[UILabel copyWithZone:]: unrecognized selector sent to instance 0x92b79a0
2012-05-28 13:13:56.997 OOKL[36012:17303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UILabel copyWithZone:]: unrecognized selector sent to instance 0x92b79a0'
*** First throw call stack:
(0x2933052 0x44c7d0a 0x2934ced 0x2899f00 …Run Code Online (Sandbox Code Playgroud) 在类中实现此NSCopying方法以启用复制时,区域参数的用途是什么?如果我设置一个新对象,我不需要用allocWithZone分配它,因为一个分配就够了......我很困惑......
我读了很多关于它的话题,但我还是迷路了.
我想创建两种对象,一种是只有"只读"属性的不可变对象,另一种是只有"readwrite"属性的可变对象.
让我们称他们为EXCar和EXMutableCar.
EXCar是NSObject的子类,EXMutableCar是EXCar的子类.
ExCar将拥有其界面
@property (nonatomic, strong, readonly) NSString *name;
Run Code Online (Sandbox Code Playgroud)
EXMutableCar将在其界面中具有
@property (nonatomic, strong) NSString *name;
Run Code Online (Sandbox Code Playgroud)
所以当我使用它的子类EXMutableCar时,我"打开"EXCar的属性.然后它是可变的.问题是在它们之间正确复制.
我在EXCar中实现了mutableCopyWithZone:
- (id)mutableCopyWithZone:(NSZone *)zone {
EXMutableCar *mutableCopy = [[EXMutableCar allocWithZone:zone] init];
mutableCopy.name = _name;
return mutableCopy;
}
Run Code Online (Sandbox Code Playgroud)
第一个问题,是这样做的好方法吗?(我想要燕子副本)
问题出在copyWithZone上.由于EXCar的属性是readonly,我既不能在EXCar中创建,也不能在EXMutableCar中创建EXCar的新实例,并填充其属性,如下所示:
- (id)copyWithZone:(NSZone *)zone {
EXCar *copy = [[EXCar allocWithZone:zone] init];
copy.name = _name; // This can't work...
return copy;
}
Run Code Online (Sandbox Code Playgroud)
我真的不想做一个"init"方法,传入15个属性(当然,EXCar就是一个例子,真正的类充满了许多属性).通常它们是从服务器的JSON消息启动的,因此它们不需要复杂的init方法.
第二个问题是这样的,如何做一个使我的类不可变的copyWithZone?
谢谢你的帮助 :)
在与Cocoa合作之后最近转向iOS,我惊讶地得到一个带有以下错误的SIGABRT:" - [UIDeviceRGBColor copyWithZone:]:无法识别的选择器发送到实例..."我在UIColor上调用了"copy".
我查看了类引用,并且,zits,UIColor不采用任何协议,与NSColor相反.
现在,这不是什么大问题.我只是试图通过主动拥有一个颜色实例来提高效率,以便在使用后立即丢弃它.但我认为Apple在iOS中省略垃圾收集器背后的目的是鼓励开发人员完全按照我的目的去做,以便在内存不足,电池挑战的便携式设备上保持精简内存配置文件.
有关Apple理由的任何想法,还是我的假设中有一些错误?
我想允许我的类对象的深层副本,并尝试实现copyWithZone,但调用[super copyWithZone:zone]产生错误:
error: no visible @interface for 'NSObject' declares the selector 'copyWithZone:'
@interface MyCustomClass : NSObject
@end
@implementation MyCustomClass
- (id)copyWithZone:(NSZone *)zone
{
// The following produces an error
MyCustomClass *result = [super copyWithZone:zone];
// copying data
return result;
}
@end
Run Code Online (Sandbox Code Playgroud)
我该如何创建这个类的深层副本?
我有一个自定义类Thing:NSManagedObject,其属性为adminName.
我试图在这个Thing类中创建一个copyWithZone函数,但是当我运行应用程序时,它说setAdminName不存在.
在我正在使用的实现文件中
@dynamic adminName;
-(id) copyWithZone: (NSZone *) zone
{
Thing *regCopy = [[Thing allocWithZone: zone] init];
regCopy.attendeeNum = [self adminName];
return regCopy;
}
Run Code Online (Sandbox Code Playgroud)
我不相信我可以将@dynamic更改为@synthesize,因为我使用的是Core Data.
如何将一个NSString复制到另一个?
@interface MyData : NSObject
{
@private
//user's private info
NSInteger uID;
NSString *name;
NSString *surname;
NSString *email;
NSString *telephone;
//user's picture
UIImage *image;
}
@property (nonatomic, assign) int uID;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *surname;
@property (nonatomic, retain) NSString *email;
@property (nonatomic, retain) NSString *telephone;
@property (nonatomic, retain) UIImage *image;
@end
Run Code Online (Sandbox Code Playgroud)
我有两个这种类型的对象.MyData*obj1,obj2;
首先是初始化.其次我想先用初始化.
obj2 = [obj1 copy]; //crashes
newData.surname = data.surname; //crashes to
newData.email = data.email;
newData.telephone = data.telephone;
Run Code Online (Sandbox Code Playgroud)
我知道第二个对象的副本没有保留!请帮忙!感谢名单!
copywithzone ×8
ios ×5
iphone ×4
objective-c ×3
cocoa-touch ×1
copy ×1
core-data ×1
nscopying ×1
nsstring ×1