- (id) init
{
[super initWithNibName : nil
bundle : nil];
UITabBarItem *tbi = [self tabBarItem];
[tbi setTitle : @"Hypnosis"];
UIImage *i = [UIImage imageNamed : @"Hypno.png"];
[tbi setImage : i];
return self;
}
考虑上面的示例代码,我的问题是:
1
有一个“setImage”方法调用,但我找不到相应的“Image”属性 在文档中。
2
UIImage * i被语句“[tbi setImage:i]”分配给Image属性。 “* i”是否被tbi保留?如果是这样,我们应该在转让后立即发布“i”吗?
希望有知识渊博的人帮助我找到答案。
答案 0 :(得分:1)
不需要为类声明image
属性具有setImage:
方法 - 可以通过setter / getters的存在暗示存在属性。 TabBarItem将保留i
- 这是setter API的责任。这是标准行为。最后,在调用i
后不要发布setImage:
。您没有i
的拥有引用,因为它是从工厂方法返回的,而不是[[alloc] init]调用。 HTH
答案 1 :(得分:0)
1)首先,如果有setX:
方法,则不一定意味着有x
属性(我想你明白了)。但是当我检查文档时,既没有image
属性,也没有setImage:
,所以它是私有api。正如在ViewController PG中所说,你不应该要求现有的UITabBarItem,而是自己创建并分配给你的tab tabBarItem属性。像这样:
...
UIImage *image = [UIImage imageNamed : @"Hypno.png"];
UITabBarItem* theItem = [[UITabBarItem alloc] initWithTitle:@"Hypnosis" image:image tag:0];
self.tabBarItem = theItem;
[theItem release];
...
2)在这种情况下你不应该发布图像,因为你不拥有它。它由imageNamed:
方法自动释放。但是,如果您通过[[UIImage alloc] init..]
方法创建它,那么您有责任减少其保留计数。 tabBarItem将保留“是”图像。
希望这会有所帮助!