При необходимости ссылки на NSString позже, который был передан функции в классе, каков правильный путь?(iPhone Dev) - PullRequest
2 голосов
/ 02 февраля 2011

В этом примере:

@interface something : something  
{  
    NSString *saveString;  
}  

-(void)saveStringForLater:(NSString*)myString  
{  
    //do stuff with myString  
    ...  

    //then save it for later  
    saveString = myString;  
}  

-(void)someOtherTimeInFuture  
{  
    //do stuff with saveString  
    ...  
}  

Итак, учитывая вышеизложенное, мои вопросы:

1) Это безопасный / правильный способ сделать это?
2) Нужно ли беспокоиться о выпуске saveString?
3) Должен ли я копировать строку вместо того, чтобы просто сохранить указатель?

Извините за мое невежество, так как я довольно новичок в Obj-C, но имею опыт работы с C ++ и C #.

Спасибо!

Ответы [ 2 ]

1 голос
/ 02 февраля 2011

Это то, для чего @properties. Они управляют кодом получения и установки для вас, поэтому вам не нужно думать об этих вопросах.

@interface MyClass : NSObject
{
    NSString *myString;
}

@property (nonatomic, retain) NSString *myString;

@end

.m

@implementation MyClass

@synthesize myString;

-(void)dealloc
{
    [myString release];
    [super dealloc];
}

@end

С этими вещами теперь можно говорить о self.myString и не беспокоиться о памяти. Когда вы назначите ему, он сохранит. Если вы назначите снова, он освободит первый объект и сохранит новый. И тогда он будет сохраняться до тех пор, пока ваш viewcontroller не загрузится.

Вы можете во что бы то ни стало достичь той же цели с помощью iVar (что вы и делаете в своем примере кода), но тогда управление памятью остается за вами, и оно может быть немного сложным. Лучше всего использовать систему @property для правильного создания установочного кода для управления памятью.

1 голос
/ 02 февраля 2011

У вас есть 3 опции,

  1. Копировать - следует использовать, если строка может измениться или при вызове из кода, которым вы управляете, как у третьей стороны

  2. Сохранить - увеличит счетчик ссылок на объект и предотвратит его разрушение

В обоих этих вариантах вы должны отпустить его, когда закончите с ним

Наконец, вы можете определить свойство с помощью атрибута retain, copy - это позволит системе беспокоиться об управлении им и, вероятно, является лучшим вариантом в большинстве случаев

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...