У меня есть подобный код в моем AppDelegate:Objective C копия против копирования сообщения
@interface AppDelegate()
{}
@property(nonatomic, assign) UILocalNotification* mSavedLocalNotification;
@property(nonatomic, assign) UILocalNotification* tmpNotification1;
@property(nonatomic, copy) UILocalNotification* tmpNotification2;
@end
@implementation AppDelegate
@synthesize mSavedLocalNotification=mSavedLocalNotification;
@synthesize tmpNotification1=tmpNotification1;
@synthesize tmpNotification2=tmpNotification2;
- (BOOL)application:(UIApplication *) __unused application didFinishLaunchingWithOptions:(NSDictionary *) launchOptions
{
UILocalNotification* notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (notification)
{
mSavedLocalNotification = [notification copy];
tmpNotification1 = notification;
tmpNotification2 = notification;
NSLog(@"########## %p %p %p %p", mSavedLocalNotification, notification, tmpNotification1, tmpNotification2);
}
}
Из того, что я понял, читая учебники, атрибут копирования в собственности должны делать то же самое, что вызов метода копирования делает.
Так почему же эта программа для печати: 0x15d39270 0x15dcc0d0 0x15dcc0d0 0x15dcc0d0 ?
Почему свойство, которое имеет атрибут копирования tmpNotification2 = notification;
просто сохранить тот же указатель, а не клонировать его, в то время как mSavedLocalNotification = [notification copy]
; фактически создает новый.
+1 Итак, решение заключается в удалении строк '@ synthesize' и позволяет Xcode выполнять работу. – trojanfoe
После того, как я удалил часть @synthesize (которую я добавил в первую очередь, потому что другие параметры не работали) и использовал self.mSavedLocalNotification = уведомление (вместо _mSavedLocalNotification = уведомление), атрибут копирования сделал то, что я ожидал от него. Я только скопировал неизменяемый объект, потому что сильная ссылка не работала раньше (по тем же причинам копия не работала). – Gabi