我已经写了课,想给你看...
我认为这门课写的不正确,这就是为什么我的申请中有韭菜。首先, delloc 从不调用。我可以在这门课中进行哪些更改以使其变得更好,请帮助。
Articles.h
#import <Foundation/Foundation.h>
@interface Article : NSObject {
BOOL favorite;
NSMutableString * title;
NSMutableString * summary;
NSMutableString * mainLink;
NSMutableString * pubDate;
NSMutableString * author;
NSMutableString * imageLink;
}
@property (nonatomic, assign) BOOL favorite;
@property (nonatomic, retain) NSMutableString * title;
@property (nonatomic, retain) NSMutableString * summary;
@property (nonatomic, retain) NSMutableString * mainLink;
@property (nonatomic, retain) NSMutableString * pubDate;
@property (nonatomic, retain) NSMutableString * author;
@property (nonatomic, retain) NSMutableString * imageLink;
- (id)initWithValuesNSString *) inTitle mainLinkNSString *) inMainLink summaryNSString *) inSummary
pubDateNSString *) inPubDate authorNSString *) inAuthor imageLinkNSString *) inImageLink;
//Setter methods
- (void)setTheTitleNSString *) inTitle;
- (void)setTheMainLinkNSString *) inMainLink;
- (void)setTheSummaryNSString *) inSummary;
- (void)setThePubDateNSString *) inPubDate;
- (void)setTheAuthor:(NSString *) inAuthor;
- (void)setTheImageLink:(NSString *)inImageLink;
@end
Articles.m
#import "Articles.h"
@implementation Article
@synthesize favorite;
@synthesize title;
@synthesize summary;
@synthesize mainLink;
@synthesize pubDate;
@synthesize author;
@synthesize imageLink;
- (void)dealloc {
NSLog(@"article dealloc \n");
[self.title release];
[self.mainLink release];
[self.summary release];
[self.pubDate release];
[self.author release];
[self.imageLink release];
[super dealloc];
}
- (id)init {
self = [super init];
if(self) {
// set your properties...
self.title = [[[NSMutableString alloc] init] autorelease];
self.mainLink = [[[NSMutableString alloc] init] autorelease];
self.summary = [[[NSMutableString alloc] init] autorelease];
self.pubDate = [[[NSMutableString alloc] init] autorelease];
self.author = [[[NSMutableString alloc] init] autorelease];
self.imageLink = [[[NSMutableString alloc] init] autorelease];
self.favorite = NO;
}
return self;
}
- (id)initWithValues:(NSString *) inTitle mainLink:(NSString *) inMainLink summary:(NSString *) inSummary
pubDate:(NSString *) inPubDate author:(NSString *) inAuthor imageLink:(NSString *) inImageLink
{
self = [super init];
if(self) {
// set your properties ...
if (inTitle != nil) {
self.title = inTitle;
}
if (inMainLink != nil) {
self.mainLink = inMainLink ;
}
if (inSummary != nil) {
self.summary = inSummary;
}
if (inPubDate != nil) {
self.pubDate = inPubDate;
}
if (inAuthor != nil) {
self.author = inAuthor ;
}
if (inImageLink != nil) {
self.imageLink = inImageLink ;
}
self.favorite = NO;
}
return self;
}
@end
添加:
看,我的主类中有 NSXMLParser 。在我写的主类 .h 文件中:
Article * currentArticle;
现在在 .m 文件中,当解析器 didStartElement 我分配 Ant 在解析器 didEndElement 中初始化文章时,我释放它 [self.currentArticle release] ;但 delloc 不调用。
- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
// Copy current Xml Element name.
currentElement = [elementName copy];
if ([elementName isEqualToString"item"]) {
// Clear out our story item caches...
self.currentArticle = [[Article alloc] init];
}
[currentElement release];
}
添加测试版
- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
// Copy current Xml Element name.
currentElement = [elementName copy];
if ([elementName isEqualToString"item"]) {
// Clear out our story item caches...
self.currentArticle = [[Article alloc] init];
[self.currentArticle release];
}
[currentElement release];
}
看我在初始化之后添加了 [self.currentArticle release]; 并将断点放在这里...当我的应用程序第一次进入这部分代码时,它调用 init 但不调用 release第二次调用释放?但为什么 ?这是不对的
为什么我不使用自动释放!!!
self.title = [[[NSMutableString alloc] init] autorelease];
self.mainLink = [[[NSMutableString alloc] init] autorelease];
self.summary = [[[NSMutableString alloc] init] autorelease];
self.pubDate = [[[NSMutableString alloc] init] autorelease];
self.author = [[[NSMutableString alloc] init] autorelease];
self.imageLink = [[[NSMutableString alloc] init] autorelease];
我没有在这部分代码中使用自动释放,因为我已经读过它给韭菜带来了,因为当我编写自动释放时,对象会在应用程序工作结束时释放!我在写???
谢谢!!!
Best Answer-推荐答案
你可以像这样删除每个 setter
- (void)setTheSummary:(NSString *) inSummary
{
if (self.summary != nil) {
[self.summary release];
}
self.summary = [[NSMutableString alloc] initWithString:inSummary];
}
您已经将每个 ivar 声明为属性并合成了 getter 和 setter。因此,您可以设置标题,例如:
self.title = newTitle;
这将重新定义新标题并将其分配给标题并释放先前(如果存在)的值。
编辑
如果你设置属性像
self.title = [[NSMutableString alloc] init];
可变字符串的实例将被过度保留,因此会有泄漏。
Retain 将保留计数增加 1,这通过属性的声明发生,并且会通过调用 init 增加一。
改成:
self.title = [[[NSMutableString alloc] init] autorelease];
编辑 2
更改这些构造的初始化:
if (inTitle == nil) {
self.title = [[NSMutableString alloc] init];
}
else
{
[self.title release];
self.title = [[NSMutableString alloc] initWithString:inTitle];
}
收件人:
if (inTitle != nil) {
self.title = inTitle;
}
现在添加
self = [self init];
并删除
[super init];
在初始化方法的开头 initWithValues; 这将首先为您初始化属性,它减少了代码重复并使您的类更小。 [super init] 的删除只需要调用一次 NSObject 的初始化程序,您可以通过调用 self = [self init]; 来执行此操作。
您已经使用这种模式创建了一个所谓的指定初始化程序。你可以阅读更多关于初始化程序 here .
编辑 3
为了让你的初始化器完美,你应该这样写:
- (id)init
{
self = [super init];
if(self) {
// set your properties...
}
return self;
}
和
- (id)initWithValues:(NSString *) inTitle mainLink:(NSString *) inMainLink summary:(NSString *) inSummary
pubDate:(NSString *) inPubDate author:(NSString *) inAuthor imageLink:(NSString *) inImageLink
{
self = [self init];
if(self) {
// set properties with parameters ...
}
return self;
}
此模式将允许您对指定初始化程序和/或调用继承层次结构的初始化程序中可能发生的错误使用react。这将确保在出现问题时返回 nil,并且您不会将属性设置为错误的实例。
关于iphone - 类工作不正确。如何让它变得更好?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/5800916/
|