2014-10-27 2 views
0

У меня есть подобный код в моем 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

Метод «копирования» не копирует неизменяемые элементы. Поскольку они неизменяемы и не могут быть изменены, нет смысла делать копию.

Но, что еще хуже, вы, по-видимому, используете переменные экземпляра. Вы, кажется, игнорируете соглашение о кодировании, которое переменные экземпляра должны начинаться с символа подчеркивания; вы фактически активно обходите это. Вот почему ваша ошибка доступа к переменным-членам не очевидна.

+0

+1 Итак, решение заключается в удалении строк '@ synthesize' и позволяет Xcode выполнять работу. – trojanfoe

+0

После того, как я удалил часть @synthesize (которую я добавил в первую очередь, потому что другие параметры не работали) и использовал self.mSavedLocalNotification = уведомление (вместо _mSavedLocalNotification = уведомление), атрибут копирования сделал то, что я ожидал от него. Я только скопировал неизменяемый объект, потому что сильная ссылка не работала раньше (по тем же причинам копия не работала). – Gabi

Смежные вопросы