2

为了成为 iPhone SDK 上的优秀内存公民,我一直在玩一些内存。

但是,我仍然很难理解"self.something"和 just "something"之间的区别。

据我了解,“self.something”的意思是向班级要求“某事”,但我的想法有问题。让我们看看这个例子:

我已经处理过内存释放:

  1. [self.labelIBOUtlet release] -> 它崩溃了
  2. [labelIBOUtlet release] -> 它没有。

谁能解释一下是什么原因?

谢谢!

编辑:

这是我在头文件中设置的信息:

@interface viewController : UIViewController {
    UILabel * labelIBOutlet ;
}

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

3 回答 3

2

您必须了解“属性”的含义,使用“点”只是一种更快的方式来调用“特殊方法”,这些方法只是为了“设置”和“获取”变量属性而创建的。

例如,您可以拥有自己的使用子视图的类/UIView:

在 myView.h

@interface myView : UIView  {
    UIWebView *webView;
}

如果你这样做,你就没有“属性”,而只是一个对象......所以在你的 myView.m 中,你尝试像这样使用“点”:

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

然后你得到一个错误,你不能这样做,xCode说:错误:访问未知的'webView'getter方法

这只是意味着“webView”方法不存在......因为当你调用“self.webView”时,你只需调用一个名为“webView”的方法......这个方法只是返回指向你的值的指针。当你打电话时:

self.webView=someValue;

你只是在调用方法“setWebView”,这个方法只是用 someValue 设置你的对象......

但是……这两种看不见的方法是从哪里来的?

如果您告诉它使用 webView 作为属性,它们是由 xCode 本身创建的......在我们的示例中,添加一些行:

在 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];
于 2011-03-06T12:40:41.467 回答
0

如果您的对象中没有 labelIBOUtlet 声明,它将落在调用 self.labelIBOUtlet 上,因为它不存在。self == 在头文件中声明的对象中

希望它说清楚

于 2011-03-06T11:34:57.953 回答
0

你在实现文件中@synthesize labelIBOutlet 了吗?

于 2011-03-06T12:20:17.460 回答