Использование [self.labelIBOutlet release] против [labelIBOutlet release] - PullRequest
2 голосов
/ 06 марта 2011

Я немного поигрался с памятью, чтобы быть хорошим гражданином памяти в iPhone SDK.

Однако я все еще пытаюсь понять разницу между "self.something" и просто "что-то" .

Насколько я понял, "self.something" означает запросить у класса "что-то", но есть что-тонеправильно в моей мысли.Давайте рассмотрим пример:

Я работал с освобождением памяти:

  1. [self.labelIBOUtlet release] -> Это сбой
  2. [labelIBOUtlet release] -> Это не так.

Может кто-нибудь объяснить, в чем причина?

Спасибо!

РЕДАКТИРОВАТЬ:

Это информация, которую я установил в заголовочном файле:

@interface viewController : UIViewController {
    UILabel * labelIBOutlet ;
}

@property (nonatomic,retain) IBOutlet UILabel * labelIBOutlet ;

Ответы [ 3 ]

2 голосов
/ 06 марта 2011

Вы должны понимать значение слова "собственность" использование «точки» - это просто более быстрый способ вызова «специальных методов», созданных просто для «установки» и «получения» переменной-свойства.

Например, вы можете иметь свой собственный класс / UIView, который использует subView:

в myView.h

@interface myView : UIView  {
    UIWebView *webView;
}

если вы делаете именно это, у вас есть не «свойство», а просто объект ... поэтому в вашем myView.m вы пытаетесь использовать «точку» следующим образом:

NSLog(@"%i", self.webView.frame.size.width);

тогда вы получаете ошибку, вы не можете этого сделать, xCode говорит: ошибка: доступ к неизвестному методу получения 'webView'

это просто означает, что метод "webView" не существует ... Когда вы вызываете "self.webView", вы просто вызываете метод с именем "webView" ... этот метод просто возвращает указатель на ваше значение. и когда вы звоните:

self.webView=someValue;

вы просто вызываете метод "setWebView", который просто устанавливает ваш объект с помощью someValue ...

но так ... откуда берутся эти 2 невидимых метода?

они создаются самим xCode, если вы скажете ему использовать webView как свойство ... в нашем примере добавьте несколько строк:

в myView.h

    @interface myView : UIView  {
        UIWebView *webView;
    }

@property (nonatomic, retain)  UIWebView *webView;

в myView.m

@implementation myView

@synthesize webView;

// ...

выполнение этого xCode добавит вам 2 метода «webView» и «setWebView», и теперь вы можете позвонить:

NSLog(@"%i", self.webView.frame.size.width);

без ошибок ...

и вы можете поместить значение (в правильном формате, в данном случае указатель на существующий UIWebView) просто звоню:

self.webView = aUIWebView;

и не забудьте освободить его, потому что вы использовали «сохранить» в:

@property (nonatomic, retain)  UIWebView *webView;

отпустите с:

[webView release];
0 голосов
/ 06 марта 2011

Вы @synthesize labelIBOutlet в файле реализации?

0 голосов
/ 06 марта 2011

Если в вашем объекте нет объявленного labelIBOUtlet, он будет зависеть от вызова self.labelIBOUtlet, поскольку он не существует. self == находится в объекте, который объявлен в заголовочном файле

надеюсь, это прояснит

...