我有一个代码:
@interface PhotoListViewController : UIViewController
{
IBOutlet UIImageView* firstPicContainer;
IBOutlet UIImageView* secondPicContainer;
UIImage* pic_one;
UIImage* pic_two;
IBOutlet UILabel* firstPicLabel;
IBOutlet UILabel* secondPicLabel;
NSString* firstPicName;
NSString* secondPicName;
IBOutlet UILabel* authorLabelA;
IBOutlet UILabel* authorLabelB;
NSString* authorName;
}
@property (retain) UIImage* pic_one;
@property (retain) UIImage* pic_two;
@property (copy) NSString* firstPicName;
@property (copy) NSString* secondPicName;
@property (copy) NSString* authorName;
@end
问题是:我应该释放整个对象还是那些我声明了属性的对象? 例如:firstPicName是NSString并保留,当设置时,其容器是UILabel * firstPicLabel,其分配如下:
firstPicLabel.text = firstPicName;
在-viewDidLoad中。因此,作为对象的标签本身不会保留,其属性也是如此。同样的事情是与其他对象,属性被保留,其他只是一个容器。这些容器的拥有者是他们的视图,应该负责他们的释放,但我在这里有点困惑,所以我想澄清这一点。 感谢。
答案 0 :(得分:1)
简短回答:对于您声明为retain
(或copy
)的任何媒体资源,您应该在nil
方法中将其值设置为dealloc
。在您不自行保留的其他对象和字段上声明的属性,您无需担心。
答案 1 :(得分:1)
您的界面永远不会提供有关您应该或不应该发布的内容的足够信息(但它会提供线索)。
你可以拥有上面声明的所有ivars和属性,但是如果你没有初始化它们和/或访问它们的属性,那么首先永远不会有一个对象要发布。
经验法则是:1)如果您创建,复制或保留对象,则您有责任将其发布。
2)请参阅上面的规则#1。
在实践中,这里有一些例子:
@implementation...
...
pic_one = [UIImage imageNamed:@"test.png"];
...
@end
pic_one
被声明为ivar但被分配给自动释放的对象。你不必发布它。
另一个例子:
@implementation....
...
self.pic_one = [UIImage imageNamed:@"test.png"];
...
@end
您通过其评估者/属性(已声明为保留)分配了此UIImage对象,因此您负责释放它。 “在幕后”,这是通过其属性分配对象时发生的事情(例如,对于声明为retain的属性,copy将略有不同但原理相同)。
- (void)setPic_One:(UIImage*)newImage
{
if (pic_One != newImage)
{
[newImage retain];
[pic_One release];
pic_One = newImage;
}
}
最后一个:
UIImage *testImage = [[UIImage alloc] initWithImage:@"test.png"];
self.pic_one = testImage;
[testImage release];
在这种情况下,您正在分配/初始化(创建)UIImage对象,因此您负责释放它。同时你也将它分配给一个声明为retain的属性,所以当你完成它时你也有责任释放它(通常在你的dealloc方法中)。