【发布时间】:2014-08-13 22:43:18
【问题描述】:
// Marketplace.h
#import <Foundation/Foundation.h>
#import "Item.h"
@interface Marketplace : NSObject
+ (void)addItemToMarketplace:(Item *)newItem; // METHOD IN QUESTION
@end
// Marketplace.m
#import "Marketplace.h"
@interface Marketplace()
@property (strong, nonatomic) NSMutableArray *listOfItems;
@end
@implementation Marketplace
+ (void)addItemToMarketplace:(Item *)newItem // METHOD IN QUESTION
{
[self.listOfItems addObject:newItem]; // Raises 3 errors
}
@end
我已经声明了一个类方法 addItemToMarketplace,它接受一个 Item 类型的对象,并将这个 Item 添加到我在实现文件的接口中声明的 listOfItems 属性中(我不确定我是否希望其他类摆弄这个性质)。我在另一个类中使用过这种方法,例如 [Marketplace addItemToMarketplace:newItem]。我不确定如何处理在编写 [self.listOfItems addObject:newItem] 时引发的三个错误。
The 3 errors are as follows:
1. Member reference type 'struct objc_class *' is a pointer; maybe you meant to use '->'?
2. Definition of 'struct objc_class' must be imported from module 'ObjectiveC.runtime' before it is required
3. No member named 'listOfItems' in 'struct objc_class'
Making the change proposed in #1, which changes self.listOfItems to self->listOfItems, raises the error "Member reference base type 'Class' is not a structure or union"
任何帮助将不胜感激。
// NEW CHANGES!
在进行了一些更改并遵循我在其他网站上找到的一些建议后,以下是我目前所拥有的:
// Marketplace.h
#import <Foundation/Foundation.h>
#import "Item.h"
@interface Marketplace : NSObject {}
+ (Marketplace *)sharedMarket;
- (void)addItemToMarketplace:(Item *)newItem;
@end
// Marketplace.m
#import "Marketplace.h"
@interface Marketplace()
@property (strong, nonatomic)NSMutableArray *listOfItems;
@end
static Marketplace *sharedMarketplace = nil;
@implementation Marketplace
+ (Marketplace *)sharedMarket
{
if (sharedMarketplace == nil) {
sharedMarketplace = [[super allocWithZone:NULL] init];
}
return sharedMarketplace;
}
- (void)addItemToMarketplace:(Item *)newItem
{
[self.listOfItems addObject:newItem];
}
- (id)init
{
if ( (self = [super init]) ) {
}
return self;
}
+ (id)allocWithZone:(NSZone *)zone {
return [self sharedMarket];
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
@end
问题、cmets、疑虑?
【问题讨论】:
-
'+' 是一个类方法。 'self' 指的是类的一个实例。您的“listOfItems”变量是一个实例变量。这只有在你的班级使用 Singleton 时才有效。
-
基本问题是属性属于对象,而不是类。如果您只想将其中一个用于类并从类方法访问它,则需要将
listOfItems设为静态指针。 -
您的应用中是否只有一个 marketplace 实例?如果是这样,您可以创建一个单例市场并使用此模式:
[[Marketplace theMarketplace] addItem:<*item*>] -
好的,有道理。我只在本课程之外引用一次 Marketplace。这是我第一次看到 Singleton 这个词。有人可以解释或指向我的在线文章吗?
-
单例只是意味着应用程序中只有一个类的实例。参看。 stackoverflow.com/a/5720147/210171
标签: objective-c arrays static-methods