views:

915

answers:

4

The object inherits from NSObject. Is there a method to create a copy of it as a new object?

(Edit — I'm trying to copy a UIButton).

A: 

If it implements the NSCopying protocol, then the -copy method should do the trick.

Stephen Darlington
I'm trying to copy a UIButton. Any ideas?
James Skidmore
+1  A: 

You can get more information about the -copy method and how it works with sub-objects on the ADC reference site. As Stephen Darlington mentions, you need to implement the NSCopying protocol in your object.

documentation

Weegee
+8  A: 

UIButton does not conform to NSCopying, so you cannot make a copy via -copy.

However, it does conform to NSCoding, so you can archive the current instance, then unarchive a 'copy'.

NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: button];
UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];

Afterwards, you'll have to assign any additional properties that weren't carried over in the archive (e.g. the delegate) as necessary.

Jim Correia
Clever! I would've probably just added -copy via a category, but this is better. =)
Dave DeLong
Great idea, thanks Jim!
James Skidmore
+2  A: 

UIButton doesn't conform to the NSCopying protocol, so you have copy it by hand. On the other hand, it is not a bad thing, since it is not exactly clear what does it mean to copy a button. For example, should it add the button copy to the same view the original is in? Should it fire the same methods when tapped?

Marco Mustapic