使用[self.labelIBOutlet release] vs [labelIBOutlet release]

时间:2011-03-06 11:29:40

标签: ios memory-management dealloc

为了成为iPhone SDK上的好记忆,我一直在玩内存。

但是我仍然很难理解“self.something”“某事”之间的区别。

据我所知,“self.something”意味着向班级询问“某事”,但我的想法有些不对劲。我们来看看这个例子:

我使用了记忆释放:

  1. [self.labelIBOUtlet release] - >它崩溃了
  2. [labelIBOUtlet release] - >它没有。
  3. 有谁能解释一下我的原因是什么?

    谢谢!

    编辑:

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

    @interface viewController : UIViewController {
        UILabel * labelIBOutlet ;
    }
    
    @property (nonatomic,retain) IBOutlet UILabel * labelIBOutlet ;
    

3 个答案:

答案 0 :(得分:2)

你必须明白“财产”的含义 使用“dot”只是一种更快的方法来调用“set”和“get”变量属性创建的“特殊方法”。

例如,您可以拥有自己的类/ UIView,它使用subView:

myView.h中的

@interface myView : UIView  {
    UIWebView *webView;
}

如果你这样做,你就没有“财产”,只是一个ojbect ...... 所以在你的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];

答案 1 :(得分:0)

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

中声明的对象中

希望它能说清楚

答案 2 :(得分:0)

你是否在实现文件中@synthesize labelIBOutlet?